C# 在Unity中使用优先级/回退和泛型的依赖项注入

C# 在Unity中使用优先级/回退和泛型的依赖项注入,c#,.net,inversion-of-control,unity-container,C#,.net,Inversion Of Control,Unity Container,假设我有一个泛型接口和一个实现它的泛型类 interface IRepository<TModel> { } [RegisterGeneric(typeof(IRepository<>))] class GenericRepository<TModel> : IRepository<TModel> { } 同时,您可以看到我使用了两个属性,这样我可以扫描属性,并在应用程序启动时自动将它们注册到Unity。我想要的是: IRepository映射

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

interface IRepository<TModel> { }

[RegisterGeneric(typeof(IRepository<>))]
class GenericRepository<TModel> : IRepository<TModel> { }
同时,您可以看到我使用了两个属性,这样我可以扫描属性,并在应用程序启动时自动将它们注册到Unity。我想要的是:

  • IRepository
    映射到
    GenericRepository
  • IRepository
    已映射到
    OrderRepository

  • 对于功能中的那些新模型,如果添加了特定的存储库(如Order),则接口应该映射到特定的实现。否则,它将映射到泛型。如何实现优先级功能?

    在Unity中,当您进行多次注册时,Unity将为您建立一个注册集合,其中最后一次注册成为“默认”注册。因此,在这方面,您应该能够做到以下几点:

    container.RegisterType(typeof(IRepository)、typeof(GenericRepository));
    //覆盖多个特定实现(此处为I映像批注册)
    RegisterType(typeof(IRepository),typeof(OrderRepository));
    container.RegisterType(typeof(i存储),typeof(CustomerRepository));
    
    你是对的。我又犯了一个愚蠢的错误,这导致一切都不正确。顺便说一句,即使你在
    IRepository
    之前注册了
    IRepository
    IRepository
    仍然有更高的优先级,unity已经处理了它们的优先级,而不仅仅是注册顺序。@DannyChen:嗯,很有趣,所以这个行为和简单的喷油器处理这个的方式是一样的。开放泛型注册是通过未注册的类型解析来处理的,这意味着在缺少具体注册时,它们总是作为备用项使用。
    [Register(typeof(IRepository<Order>))]
    class OrderRepository : GenericRepository<Order> { }