C# 将已定义类型的泛型接口注册到未定义类型的泛型接口有什么区别?

C# 将已定义类型的泛型接口注册到未定义类型的泛型接口有什么区别?,c#,ioc-container,C#,Ioc Container,在如何将实现的泛型接口注册到my中的多个类中,我遇到了一个问题,我使用这段代码解决了这个问题 container.RegisterType(typeof (IRepository<Location>), typeof (LocationRepository)); container.RegisterType(typeof (IRepository<ProductDto>), typeof (ProductRepository)); container.RegisterTy

在如何将实现的泛型接口注册到my中的多个类中,我遇到了一个问题,我使用这段代码解决了这个问题

container.RegisterType(typeof (IRepository<Location>), typeof (LocationRepository));
container.RegisterType(typeof (IRepository<ProductDto>), typeof (ProductRepository));
container.RegisterType(typeof (IRepository<Customer>), typeof (CustomerRepository));
container.RegisterType(typeof (IRepository<CustomerAddress>), typeof (CustomerAddressRepository));
container.RegisterType(typeof (IRepository<CustomerTerms>), typeof (CustomerTermRepository));
container.RegisterType(typeof (IRepository<AmountDto>), typeof (ProductListPricingRepository));
container.RegisterType(typeof (IRepository<Contact>), typeof (ContactRepository));
container.RegisterType(typeof(IRepository)、typeof(LocationRepository));
RegisterType(typeof(IRepository)、typeof(ProductRepository));
container.RegisterType(typeof(i存储),typeof(CustomerRepository));
RegisterType(typeof(IRepository)、typeof(CustomerAddressRepository));
RegisterType(typeof(IRepository)、typeof(CustomerTermRepository));
container.RegisterType(typeof(IRepository)、typeof(ProductListPricingRepository));
container.RegisterType(typeof(IRepository)、typeof(ContactRepository));

上面的代码按预期工作,但出于好奇,我也尝试了一些实验,并在没有定义类型的情况下注册它,如下面的代码,它似乎与第一个一样工作

container.RegisterType(typeof (IRepository<>), typeof (LocationRepository));
container.RegisterType(typeof (IRepository<>), typeof (ProductRepository));
container.RegisterType(typeof (IRepository<>), typeof (CustomerRepository));
container.RegisterType(typeof (IRepository<>), typeof (CustomerAddressRepository));
container.RegisterType(typeof (IRepository<>), typeof (CustomerTermRepository));
container.RegisterType(typeof (IRepository<>), typeof (ProductListPricingRepository));
container.RegisterType(typeof (IRepository<>), typeof (ContactRepository));
container.RegisterType(typeof(IRepository)、typeof(LocationRepository));
RegisterType(typeof(IRepository)、typeof(ProductRepository));
container.RegisterType(typeof(i存储),typeof(CustomerRepository));
RegisterType(typeof(IRepository)、typeof(CustomerAddressRepository));
RegisterType(typeof(IRepository)、typeof(CustomerTermRepository));
container.RegisterType(typeof(IRepository)、typeof(ProductListPricingRepository));
container.RegisterType(typeof(IRepository)、typeof(ContactRepository));
现在我的问题是:

  • 除了代码的可读性之外,两者之间的区别是什么

  • 如果我选择其中一个,他们有什么暗示吗

  • 如果我有此代码,最佳实践是什么


  • 第二个方法名为open generic registration。当您的具体类也是泛型的时,此方法非常有用,这样您就不需要为每个类注册类型

    例如,如果您有:

    interface IRepository<T>{}
    
    interface-IRepository{}
    

    类存储库:IRepository{}
    
    在IoC中,您可以简单地写一行:

    container.RegisterType(typeof (IRepository<>), typeof (Repository<>));
    
    container.RegisterType(typeof(IRepository)、typeof(Repository));
    
    而不是

    container.RegisterType(typeof (IRepository<User>), typeof (Repository<User>));
    container.RegisterType(typeof (IRepository<Product>), typeof (Repository<Product>));
    container.RegisterType(typeof (IRepository<Customer>), typeof (Repository<Customer>));
    container.RegisterType(typeof (IRepository<CustomerAddress>), typeof (Repository<CustomerAddress>));
    // and so on
    
    container.RegisterType(typeof(IRepository)、typeof(Repository));
    RegisterType(typeof(IRepository),typeof(Repository));
    RegisterType(typeof(IRepository),typeof(Repository));
    RegisterType(typeof(IRepository),typeof(Repository));
    //等等
    

    如您所见,如果不打开通用注册,我们需要为每个项目分别注册

    “它似乎与第一个项目一样工作”这将不起作用,因为RegisterType调用将全部覆盖themselve,因此只有最后一个项目在容器中注册
    container.RegisterType(typeof (IRepository<User>), typeof (Repository<User>));
    container.RegisterType(typeof (IRepository<Product>), typeof (Repository<Product>));
    container.RegisterType(typeof (IRepository<Customer>), typeof (Repository<Customer>));
    container.RegisterType(typeof (IRepository<CustomerAddress>), typeof (Repository<CustomerAddress>));
    // and so on