2009-10-28 6 views
1

내 컨트롤러에 대해 정의 된 욕심 많은 생성자가 있습니다. 각 컨트롤러에는 ILoggingService 인스턴스가 필요합니다. 이제는 내 의존성 주입 (StructureMap ..이지만 사용하지 않으면 계속 읽으십시오) 잘 작동합니다. 그러나 ILoggingService 욕심 많은 생성자가 String이 필요합니다. 이 값은 컨트롤러의 정규화 된 이름입니다. 또는 일부 텍스트 (너무 어렵다면)입니다.종속성 주입 및 ASP.NET MVC에 문제가 있습니다

예를 들어, 현재 코드 ..

public AccountController(IAccountService accountService, 
    ILoggingService loggingService) { ... } 

예를 들어 희망찬 pseduo 코드 ...

public AccountController(IAccountService accountService, 
    ILoggingService loggingService(this.GetType().ToString() 
    .. or hardcod "X.Y..AccountController") 
{ ... } 

이 가능할까요? 나는 레지스트리/부트 스트랩에서 뭔가 까다로운 것을 정의해야 할 것 같은데?

참고 : 리플렉션을 사용해 보았습니다. 그러나 IoC는 삽입 된 각 인스턴스에 대해 고유 한 개체 이름을 생성하는 인스턴스 작성기를 사용하기 때문에 작동하지 않습니다.

도와주세요!

답변

1

ILoggingService를 제네릭으로 만들 수 있습니까? 그런 다음 ILoggingService<AccountController>을 요청할 수 있습니다.

로깅 서비스는과 같이 그것의 사용을 만들 수 :

class LoggingService<T> : ILoggingService<T>{ 
    ... 
    var thingName=typeof(T).ToString(); 
    ... 
} 
0

당신은 모든 인터페이스에서 생성자를 가질 수 없습니다.

DI 및 느슨한 커플 링 중 하나는 공동 작업자가 인터페이스를 통해서만 서로를 알 수 있다는 것입니다. 인스턴스가 생성되는 방식은 소비자에게는 중요하지 않습니다.

당신은 그 자체가 약간의 종속성을 필요로 ILoggingService의 구현을 가질 수 있지만,이 컨트롤러없이 우려해야 - 와 ILoggingService의 구현을 작동 할 수 있어야한다, 또는 당신은 Liskov 대체를 깨는 것 원리.

그러나 때때로 소비자에 대한 측면을 종속성에 전달해야하지만 이는 메소드 매개 변수로 더 잘 수행됩니다. 해당 문자열을 ILoggingService의 메소드에 매개 변수로 전달할 수 있습니다.

0

어떤 이름의 로거를 요구할 수있는 로거 팩토리 ILoggerFactory를 주입하십시오. this.logger = _factory.GetLogger (GetType(). Name()).

이는 IoC 특정 솔루션이 아닙니다. 저는 IoC의 큰 전문가는 아니지만 (저는 Windsor를 사용합니다) 수동으로 인스턴스를 생성하는 방법을 제공 할 수 있습니다.

ioc.ForComponent(typeof(ILoggerService)).CustomInstantiate((type, desttype) => 
    Activator.CreateInstance(type, new object[]{desttype.Name})) 
  • 좋아하지만이의 뭔가 내가 지식이 없어. 특히 IoC가 생성 할 유형뿐만 아니라 인스턴스를 소비 할 유형을 제공하기를 원한다는 점을 고려할 때.