Ninject (또는 다른 컨테이너)를 사용하여 서비스를 요청하는 유형을 어떻게 알 수 있습니까?
public interface IFooService
{
void DoSomething();
}
그리고 그 서비스의 일반적인 구현은 다음과 같습니다.
public class FooService<TRequestingClass> : IFooService
{
public virtual void DoSomething() { }
}
그리고 IFooService의 인스턴스를 필요로하는 다른 클래스가 있습니다.
public class Bar
{
private IFooService _fooService;
public Bar(IFooService fooService)
{
this._fooService = fooService;
}
}
Bar가 생성되면 FooService <Bar>의 생성자 인수가 전달되도록 IoC 컨테이너를 연결해야합니다. Bar와 같은 다른 많은 수업이 있습니다. 각각은 FooService <TRequestingClass>의 인스턴스를 필요로 할 수도 있습니다. TRequestingClass는 IFooService의 인스턴스를 필요로하는 클래스 유형입니다. IFooService의 소비자에게이 멍청함을 드러 낼 필요는 없습니다. 그들이주의해야 할 것은 전달 된 IFooService의 메서드를 호출 할 수 있다는 것입니다. 그들은 전달 된 IFooService의 구체적인 구현이 구축되는 데 특별한 것이 필요하다는 것을 알 필요가 없습니다.
FooService <T>에 대한 대안으로 생성자에 생성 될 클래스의 이름을 포함하는 문자열 인수를 가진 비 - 제네릭 클래스가됩니다. 예 :
public class FooService : IFooService
{
public FooService(string requestingClassName) { }
}
이 방법으로 종속성을 구성하려면 IoC 컨테이너를 연결하는 방법은 무엇입니까?
왜 그런 wierd 구조가 필요한지 혼란 스럽다면 log4net.LogManager.GetLogger (typeof (SomeClass))로 생성 된 ILog를 얻을 때 log4net이 가장 잘 작동하는 방법을 고려하십시오. 내가 log4net에 대한 참조를 내 코드를 쓰레기 싶지 않아, 그래서 간단한 ILogger 인터페이스를 작성하고 싶습니다 그리고 이런 식으로 구현 :
public class GenericLogger<T> : ILogger
{
private readonly ILog log;
public GenericLogger()
{
this.log = log4net.LogManager.GetLogger(typeof(T));
}
public void Debug(object message)
{
this.log.Debug(message);
}
/* .... etc .... */
}
이 종속성 반전의 위반 : – Will
종류. 그러나 ILogger의 인스턴스를 필요로하는 클래스는이 wierdness에 대해 신경 쓸 필요가 없습니다. 그것은 모두 디버그 등을 호출 할 수 있습니다. 내 ILogger의 구체적인 구현은 log4net을 사용합니다.이 클래스는 로깅을 수행하는 클래스의 이름을 알고 있으면 더 잘 작동합니다. 나는 이것이 괜찮다고 생각한다. – JohnRudolfLewis