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

相關問題