4
我試圖模擬我可以在Ninject中配置的行爲,僅使用Unity代替。在基於混合類型的Unity中註冊泛型Type
我試圖使用緩存的存儲庫模式,給出以下類和接口:
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