2

首先我正在阅读这篇文章。他使用内存存储库中的自定义来测试和证明概念原因。RepositoryEntityStore. 然后为了避免使用 new 他实现了这个不包含在文章中但在示例中。

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 一样?

4

1 回答 1

1

如果您事先并不真正知道(或者不想知道,作为 DI 的一部分)确切的类型,您可以使用Activator.CreateInstance(typeof(T))

您仍然必须确保您的类型提供默认构造函数new()

为了提供这种灵活性,您将需要使用 IoC(控制反转)容器,该容器将包含映射或某些逻辑,以确定在实例化对象时使用哪个依赖项。

这可以通过一些外部组件(例如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;
        }
    }
}
于 2012-10-23T18:07:06.087 回答