【问题标题】:Simple Injector and default AccountContoller dependency issue简单的注入器和默认的 AccountContoller 依赖问题
【发布时间】:2015-08-08 01:38:25
【问题描述】:

我的 Web Api 项目中的 Simple Injector 有问题。我使用VS生成的默认AccountController

public AccountController(ApplicationUserManager userManager,
    ISecureDataFormat<AuthenticationTicket> accessTokenFormat)

在我的配置文件中注册:

var container = new Container();

// This is an extension method from the integration package.
container.RegisterWebApiFilterProvider(config);
container.RegisterWebApiControllers(config);

container.Register<IInitializeService, InitializeService>();
container.Register<IFolderRepository, FolderRepository>();
container.Register<IUserRepository, UserRepository>();
container.Register<ILogger, Logger>();

//Authentication Wrap
container.Register<IUserStore<User, Guid>, ApplicationUserStore>();
container.Register<IDataSerializer<AuthenticationTicket>, TicketSerializer>();
container.Register<ISecureDataFormat<AuthenticationTicket>,
    SecureDataFormat<AuthenticationTicket>>();
container.Register<IDataProtector>(
    () => new DpapiDataProtectionProvider().Create("ASP.NET Identity"));

container.Verify();

// 4. Register the container as MVC3 IDependencyResolver.
DependencyResolver.SetResolver(new SimpleInjectorWebApiDependencyResolver(container));
config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);

我虽然 Simple Injector 足够聪明,可以处理所有负责默认身份的内置依赖项,我不需要手动注册它们,但如果我不注册它们,我会遇到异常。

仍然出现异常:

SecureDataFormat 类型的构造函数包含名称为“encoder”的 ITextEncoder 类型的参数,该参数未注册。请确保在容器中注册了 ITextEncoder,或者更改 SecureDataFormat 的构造函数。

有没有办法自动处理?

【问题讨论】:

标签: c# authentication dependency-injection owin simple-injector


【解决方案1】:

我实现了一个 Web Api 并编写了这段代码。 这对我有用

container.RegisterWebApiRequest<ISecureDataFormat<AuthenticationTicket>, SecureDataFormat<AuthenticationTicket>>();
container.RegisterWebApiRequest<ITextEncoder, Base64UrlTextEncoder>();
container.RegisterWebApiRequest<IDataSerializer<AuthenticationTicket>, TicketSerializer>();
container.RegisterWebApiRequest<IDataProtector>(() => new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider().Create("ASP.NET Identity"));

【讨论】:

  • 这对我帮助很大。谢谢。
【解决方案2】:

容器应该如何知道你想在SecureDataFormat的构造函数中使用ITextEncoder的哪个实现?

你必须告诉它使用哪一个。我认为规则基本上是这样的:

如果(构造函数)需要一个接口,那么它需要知道要使用哪个实现。如果需要具体类,它将自动构建该类的实例(假设它可以解析该类所需的所有类型)。

由于您的SecureDataForms 需要一个接口,您必须注册一个接口,否则它唯一的选择是“猜测”您想要的实现,如果存在多个实现,这可能会默默地出错。

【讨论】:

    【解决方案3】:

    我刚刚遇到了这个问题。我正在使用ninject,但你会明白的。这是我的绑定:

    kernel.Bind<ITextEncoder>().To<Base64UrlTextEncoder>();
    

    根据the source,我见过的唯一用于新建 SecureDataFormat 实例的是 Base64UrlTextEncoder。因此,使用它似乎是一个安全的选择,但乍一看,我当然不清楚如何适当地使用这个构造函数重载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 1970-01-01
      相关资源
      最近更新 更多