我的Web Api项目中的Simple Injector存在问题。我是用户生成的默认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类型的构造函数包含ITextEncoder类型的参数,其名称为“encoder”,未注册。请确保ITextEncoder已在容器中注册,或更改SecureDataFormat的构造函数。
有没有办法自动处理?
答案 0 :(得分: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"));
答案 1 :(得分:4)
容器如何知道要在ITextEncoder
的构造函数中使用哪个SecureDataFormat
实现?
你必须告诉它使用哪一个。我认为规则基本上是这样的:
如果需要一个接口(由构造函数),那么它需要知道要使用哪个实现。如果需要具体类,它将自动构建该类的实例(假设它可以解析类所需的所有类型)。
由于您的SecureDataForms
需要一个接口,您必须注册一个接口,否则它唯一的选择是“猜测”您想要的实现,如果存在多个实现,则可能会出现问题。
答案 2 :(得分:0)
我刚刚遇到了这个问题。我正在使用ninject但你会明白这个想法。这是我的约束力:
kernel.Bind<ITextEncoder>().To<Base64UrlTextEncoder>();
根据the source,我用来创建SecureDataFormat实例的唯一东西是Base64UrlTextEncoder。因此,使用它似乎是一个安全的选择,但乍一看我肯定不清楚如何正确使用这个构造函数重载。