3

我的Web Api项目中的简单喷油器出现问题。我用户默认AccountController由VS生成。简单的喷油器和默认的AccountContoller依赖项问题

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

我虽然是简单的喷油器将是足够的智慧来处理所有建设负责默认标识的依赖性,而我不会需要手动注册它们,但如果我不注册他们,我会收到例外。

仍然得到一个例外:

型SecureDataFormat的构造函数包含未注册名称“编码器”类型ITextEncoder的参数。请确保ITextEncoder已在容器中注册,或更改SecureDataFormat的构造函数。

有没有办法自动处理?

+1

相关:https://stackoverflow.com/questions/26643407/simple-injector-injecting-isecuredataformat-into-accountcontroller – Steven 2014-11-03 12:50:24

回答

4

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

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

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

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

0

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

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

the source,我见过的唯一的事被用于新的了SecureDataFormat的一个实例是Base64UrlTextEncoder。所以这似乎是一个安全的使用方法,但乍看之下,我一定不清楚如何正确使用这个构造函数重载。

7

我实现了一个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

这帮了我这么多。谢谢。 – Pinski 2016-05-12 04:12:42

相关问题