3

내 Web API 프로젝트에서 Simple Injector에 문제가 있습니다. VS에서 생성 한 사용자 기본값은 AccountController입니다. 내 구성 파일에서간단한 인젝터 및 기본 AccountContoller 종속성 문제

public AccountController(ApplicationUserManager userManager, 
    ISecureDataFormat<AuthenticationTicket> accessTokenFormat) 

I 등록 :

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

나는 그 간단한 인젝터 모두가 기본 ID에 대한 책임 의존성에 구축하고 난 못해 수동으로 등록해야 처리 할 수있을만큼 스마트 될 것입니다하지만,하지만, 등록하지 않으면 예외가 생깁니다.

형 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

관련 문제