Ninject에서 구성 할 수있는 동작을 에뮬레이트하려고하는데 대신 Unity 만 사용하십시오. 콘크리트 유형을 기반으로 한 Unity의 일반 유형 등록
나는 다음과 같은 클래스와 인터페이스를 제공, 캐시 된 저장소 패턴을 사용하려고 시도하고있다 :public interface IRepository<T>
{
T Get();
}
public class SqlRepository<T> : IRepository<T>
where T : new()
{
public T Get()
{
Console.WriteLine("Getting object of type '{0}'!", typeof(T).Name);
return new T();
}
}
public class CachedRepository<T> : IRepository<T>
where T : class
{
private readonly IRepository<T> repository;
public CachedRepository(IRepository<T> repository)
{
this.repository = repository;
}
private T cachedObject;
public T Get()
{
if (cachedObject == null)
{
cachedObject = repository.Get();
}
else
{
Console.WriteLine("Using cached repository to fetch '{0}'!", typeof(T).Name);
}
return cachedObject;
}
}
기본적으로, 내 응용 프로그램 IRepository<T>
사용하는 시간, 그것은 CachedRepository<T>
의 인스턴스를 얻어야한다. 그러나 CachedRepository<T>
안에는 SqlRepository<T>
의 실제 SQL 저장소를 가져와야합니다. Ninject에서 다음을 사용하여이 작업을 수행했습니다.
ninjectModule.Bind(typeof(IRepository<>)).To(tyepof(SqlRepository<>)).WhenInjectedExactlyInto(tyepof(CachedRepository<>));
ninjectModule.Bind(typeof(IRepository<>)).To(tyepof(CachedRepository<>));
Unity에서 어떻게 동일한 작업을 수행 할 수 있습니까? 나는 작동 제네릭이 아닌 저장소에 대한 버전이 있습니다
UnityContainer container = new UnityContainer();
container.RegisterType<IWidgetRepository, CachedWidgetRepository>(new InjectionMember[] { new InjectionConstructor(new SqlWidgetRepository()) });
을하지만 당신은 구문 오류없이 new SqlRepository<>
말할 수 없기 때문에이 구문은 일반 저장소와 전혀 작동하지 않습니다. 어떤 아이디어?
관련 : https://stackoverflow.com/questions/9813630/how-to-do-open-generic-decorator-chaining-with-unity-unityautoregistration – Steven