简单的Injector和默认的AccountContoller依赖性问题

DrA*_*qon 4 c# authentication dependency-injection simple-injector owin

我在Web Api项目中遇到Simple Injector问题.我的用户默认AccountController由VS生成.

public AccountController(ApplicationUserManager userManager,
    ISecureDataFormat<AuthenticationTicket> accessTokenFormat)
Run Code Online (Sandbox Code Playgroud)

在我的配置文件中我注册:

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);
Run Code Online (Sandbox Code Playgroud)

我虽然Simple Injector足够聪明,可以处理所有依赖负责默认身份的构建,我不需要手动注册它们,但如果我不注册它们,我会得到例外.

仍然有例外:

SecureDataFormat类型的构造函数包含ITextEncoder类型的参数,其名称为"encoder",未注册.请确保ITextEncoder已在容器中注册,或更改SecureDataFormat的构造函数.

有没有办法自动处理?

小智 9

我实现了一个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"));
Run Code Online (Sandbox Code Playgroud)


Sam*_*der 4

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

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

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

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