将带有已定义类型的通用接口注册到没有类型的通用接口有什么区别?

时间:2015-07-27 10:07:25

标签: c# ioc-container

我在如何在我的UnityContainer中将我的通用接口注册到多个类中时遇到问题,我使用此代码来解决这个问题。

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));
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));

现在我的问题是:

  1. 除了代码的可读性之外,两者之间有什么区别?

  2. 如果我选择其中一个,是否有任何暗示?

  3. 如果我有这段代码,最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

第二个方法名为open generic registration。当您的具体类也具有通用性,然后您不需要为每个类注册一个类型时,此方法很有用。

例如,如果你有:

interface IRepository<T>{}

class Repository<T>:IRepository<T>{}

只需在IoC中你就可以编写一个简单的行:

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

如您所见,如果没有开放式通用注册,我们需要为每个项目单独注册