Unity中具有优先级/回退和泛型的依赖注入

本文关键字:泛型 依赖 注入 回退 优先级 Unity | 更新日期: 2023-09-27 18:15:11

假设我有一个泛型接口和实现它的泛型类。

interface IRepository<TModel> { }
[RegisterGeneric(typeof(IRepository<>))]
class GenericRepository<TModel> : IRepository<TModel> { }

UserOrder两种模型。User没有什么特别的,所以它使用通用的存储库实现。Order是不同的,所以我有一个特定的存储库。

[Register(typeof(IRepository<Order>))]
class OrderRepository : GenericRepository<Order> { }

同时你可以看到我使用两个属性,这样我就可以扫描属性并在应用程序启动时自动将它们注册到Unity。我想要的是:

  1. IRepository<User>映射到GenericRepository<User>
  2. IRepository<Order>映射到OrderRepository
对于特性中的那些新模型,如果添加了特定的存储库(如Order),则应该将接口映射到特定的实现。否则它会被映射到泛型。如何实现优先级函数?

Unity中具有优先级/回退和泛型的依赖注入

在Unity中,当你进行多个注册时,Unity将为你建立一个注册集合,其中最后一个注册成为"默认"注册。因此,在这方面,您应该能够执行以下操作:

container.RegisterType(typeof(IRepository<>), typeof(GenericRepository<>));
// Override multiple specific implementations (I image batch registration here)
container.RegisterType(typeof(IRepository<Order>), typeof(OrderRepository));
container.RegisterType(typeof(IRepository<Customer>), typeof(CustomerRepository));