gpt4 book ai didi

c# - 如何在 C# 中不使用 new() 获取存储库

转载 作者:太空宇宙 更新时间:2023-11-03 13:53:36 24 4
gpt4 key购买 nike

首先我正在读这个article .他使用自定义内存存储库进行测试和概念验证。 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 吗?

最佳答案

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

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

为了提供这种灵 active ,您需要使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com