의존성 주입 + mvc에 대한 몇 가지 테스트를하고 있는데 질문이 있습니다.의존성 주입 - 인터페이스에서 객체 만들기
서비스 내에서 메소드의 결과가 될 객체 (트로프 인터페이스)를 어떻게 만들 수 있습니까?
추상 팩토리가이 문제를 해결할 수 있다는 것을 알았지 만 일부 사람들은 이것이 반 패턴이고 서비스 탐지기라고 말합니다.
이public class ObjectFactory : IFactory
{
readonly Container container;
public ObjectFactory(Container container)
{
this.container = container;
}
public T Create<T>()
where T : class
{
return (T)this.container.GetInstance<T>();
}
}
가 나는 이렇게 사용 :
내가 이런 짓을 한
public class CacheService : ICacheService
{
readonly IFactory factory;
public CacheService(IFactory factory)
{
this.factory = factory;
}
private void Insert(string name, object value)
{
if (this.CacheAvailable())
{
Remove(name);
// This line where I ask for the container to resolve this interface
ICacheItemWrapper item = factory.Create<ICacheItemWrapper>();
item.Value = value;
HttpRuntime.Cache.Insert(name, item, null, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration);
}
}
/* HIDDEN CODE */
}
이 안티 패턴 아직인가?
변경해야 할 사항은 무엇입니까?
그것은 다음과 같이 그것을 할 잘못된 느낌...
'CacheService' 생성자가 단순히'IFactory' 대신에'ICacheItemWrapper'의 인스턴스를 요구할 수 있습니까? 그것은 의존성이 무엇인지를 생성자에게 광고함으로써 "반 패턴"문제를 해결할 것입니다. 이 문제에 대해 일반적으로 다른 사상 학교가 있습니다. 개인적으로 DI는 시간이 지남에 따라 레거시 코드베이스로 리팩토링 할 때 엄청나게 유용하지만 새로운 코드베이스를 만들 때 특정 종속성을 직접 제공하는 것을 선호합니다. – David
하지만 같은 방법으로 다른 방법을 사용해야 할 때 각 방법마다 그 종류의 깨끗한 물체가 필요합니까? –
흥미 롭습니다. 종속성 유형에 특정한 팩토리가 그 자체가 의미있는 의존성이 될지 궁금합니다. 그것은 내부 종속성을 감쌀 것이지만, 그 자체로 "깨끗한 인스턴스"를 제공 할 책임이 있습니다. (인스턴스 자체가 그 기능을 제공 할 수 없다고 가정하고, 그것이 불가능한 이유를 생각할 수는 없다. 왜냐하면 그것이 엣지 케이스가 존재하지 않는다는 것을 의미하지는 않는다.) 하나의 "서비스 로케이터 (locator) "와 유사한 기능을 수행합니다. 그러나 그것은 의존성 자체와 더 밀접하게 관련되어 있으며 그 의존성의 일부입니다. 정말로 큰 소리로 생각하고있어. – David