首先,我正在阅读article。他使用内存存储库中的自定义进行测试和概念证明。 RepositoryEntityStore
。
然后,为了避免使用新的方法,他实现了本文未包含但示例中包含的内容。
namespace eDirectory.Naive.Repository
{
/// <remarks>
/// version 0.2 Chapter II: Repository
/// </remarks>
public class RepositoryLocatorEntityStore
: RepositoryLocatorBase
{
protected Dictionary<Type, object> RepositoryMap = new Dictionary<Type, object>();
public override IRepository<T> GetRepository<T>()
{
var type = typeof(T);
if (RepositoryMap.Keys.Contains(type)) return RepositoryMap[type] as IRepository<T>;
var repository = new RepositoryEntityStore<T>();
RepositoryMap.Add(type, repository);
return repository;
}
}
}
后来我认为他甚至不使用DI来创建
RepositoryEntityStore
的实例。问题是我该如何修改它以便与扩展
RepositoryEntityStore
的类一起使用?喜欢CustomerRepositoryEntityStore吗? 最佳答案
如果您真的不事先知道(或不想知道,作为DI的一部分)确切的类型,则可以使用Activator.CreateInstance(typeof(T))
您仍然必须确保您的类型提供默认的构造函数new()
为了提供这种灵活性,您将需要使用IoC(Inversion of Control)容器,该容器将包含映射或某些逻辑来确定在实例化对象时使用哪种依赖关系。
这可以通过某些外部组件(例如ninject)来实现,也可以像在类型和程序集之间生成映射的配置文件一样简单。
然后,由于使用的是通用类,因此需要Make
正确的(计算的)类型。此命令负责此操作:MakeGenericType(type)
然后,您将能够创建此生成类型的实例。
因此您的代码如下所示:
namespace eDirectory.Naive.Repository
{
/// <remarks>
/// version 0.2 Chapter II: Repository
/// </remarks>
public class RepositoryLocatorEntityStore
: RepositoryLocatorBase
{
protected Dictionary<Type, object> RepositoryMap = new Dictionary<Type, object>();
public override IRepository<T> GetRepository<T>()
{
var type = typeof(T);
if (RepositoryMap.Keys.Contains(type)) return RepositoryMap[type] as IRepository<T>;
Type DIRepository = IoCContainer.getType()// get the right type from your mapping (IoC container)
var repository = Activator.CreateInstance(DIRepository.MakeGenericType(type));
RepositoryMap.Add(type, repository);
return repository;
}
}
}
关于c# - 如何在C#中获取没有new()的存储库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13017747/