gpt4 book ai didi

c# - 如何使用通过依赖注入(inject)使用泛型的存储库接口(interface)?

转载 作者:可可西里 更新时间:2023-11-01 08:08:21 28 4
gpt4 key购买 nike

我正在尝试使用以下通用存储库接口(interface)进行 DI 和构造函数注入(inject):

public interface IRepository<TEntity> : IDisposable where TEntity : class

问题是为了定义接口(interface)的实例,我必须像这样提供类类型:

private IRepository<Person> _personRepository;

这个问题是如果我使用 DI(并且我使用 Unity 作为 IoC 框架),那么我必须在我的构造函数中定义多个实例来获取我需要使用的所有存储库接口(interface),如下所示:

public MyClass(IRepository<Person> personRepository,
IRepository<Orders> ordersRepository,
IRepository<Items> itemsRepository,
IRepository<Locations> locationsRepository)
{
_personRepository = personRepository;
_OrdersRepository = ordersRepository;
_itemsRepository = itemsRepository;
_locationsRepository = locationsRepository;
}

问题:

  1. 这样可以吗?
  2. 如果不是,我在这个概念上迷失了什么?
  3. 即使这是正确的,Unity 将接口(interface)注册为具体类型的意义何在?我已经这样做了,因为通用存储库迫使我进行声明。

请帮我解决这个问题,非常感谢你的帮助!

最佳答案

正如 D Stanley 所指出的,依赖项必须是一个具体的接口(interface)。否则,你要在哪里声明T?您的依赖类可能是通用的,但在某些时候您仍然必须说“T 是一个人”。

也就是说,Unity 可以很好地处理注册泛型类型。

假设您实现了 IRepository<T>具有通用类 Repository<T>包裹着 DbSet<T> (或其他)。

以下注册和解析将起作用(包括注入(inject)任何构造函数):

container.RegisterType(typeof(IRepository<>), typeof(Repository<>));

// no specific registration needed for the specific type resolves
container.Resolve(<IRepository<Person>);
container.Resolve(<IRepository<Order>);

如果您需要特定类型的覆盖(说 Items 存储库出于某种原因是特殊的,因此它具有完全实现的 ItemRepository 类),只需在通用实现之后注册该特定实现:

container.RegisterType<IRepository<Item>, ItemRepository>();

正在解析 IRespository<Item>现在将获得您的具体实现。

郑重声明,我认为这只能在代码中完成,而不能在配置文件中完成。有人随时可以纠正该假设。

关于c# - 如何使用通过依赖注入(inject)使用泛型的存储库接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14365625/

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