3

У меня проблема с Simple Injector в моем проекте Web Api. I пользователь по умолчанию 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); 

я хоть что просто Injector будет достаточно умен, чтобы обрабатывать все строить в зависимости ответственных за идентичность по умолчанию, и я не будет нужно зарегистрировать их вручную, но Я получаю исключения, если я не зарегистрирую их.

Все еще получаю исключение:

Конструктор типа SecureDataFormat содержит параметр типа ITextEncoder с именем «кодировщика», который не зарегистрирован. Убедитесь, что ITextEncoder зарегистрирован в контейнере или изменил конструктор SecureDataFormat.

Есть ли способ отрегулировать это автоматически?

+1

Связанный: https://stackoverflow.com/questions/26643407/simple-injector-injecting-isecuredataformat-into-accountcontroller – Steven

ответ

4

Как контейнер должен знать, какую реализацию ITextEncoder вы хотите использовать в конструкторе SecureDataFormat?

Вы должны сказать, какой из них использовать. Я думаю, что правила в основном идут примерно так:

Если требуется интерфейс (конструктором), ему необходимо знать, какую реализацию использовать. Если требуется конкретный класс, он автоматически построит экземпляр этого класса (предполагая, что он может разрешить все типы, которые нужны классу).

Как ваш SecureDataForms нужен интерфейс, вам необходимо его зарегистрировать, в противном случае его единственным вариантом было бы «угадать», в котором вы хотите, и это могло бы пойти не так, как если бы было более одной реализации.

0

Я только что придумал эту проблему. Я использую ninject, но вы получите эту идею. Вот мой привязки:

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

Согласно the source, единственная вещь, которую я когда-либо видеть, используется для нового вверх экземпляра SecureDataFormat является Base64UrlTextEncoder. Таким образом, это казалось безопасной ставкой для использования, но мне, конечно, не ясно, на первый взгляд, как правильно использовать эту конструкторскую перегрузку.

7

Я реализовал веб-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