简单注入器和默认AccountContoller依赖关系问题

本文关键字:依赖 关系 问题 AccountContoller 默认 注入器 简单 | 更新日期: 2023-09-27 18:28:56

我的WebApi项目中的Simple Injector有问题。VS.生成的I用户默认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的构造函数。

有什么方法可以自动处理吗?

简单注入器和默认AccountContoller依赖关系问题

我实现了一个WebApi,并编写了这段代码。这对我有效

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"));

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

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

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

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

我刚刚遇到了这个问题。我在用ninject,但你会明白的。这是我的装订:

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

根据消息来源,我唯一看到的用于新建SecureDataFormat实例的东西是Base64UrlTextEncoder。因此,使用它似乎是一个安全的选择,但我第一眼肯定不清楚如何适当地使用这个构造函数重载。