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

4

我在使用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. 如果我有这段代码,最佳实践是什么?


似乎它的工作方式与第一个相同,但这样做是行不通的,因为RegisterType调用会互相覆盖,以至于只有最后一个被注册到容器中。 - Jehof
1个回答

1
第二种方法称为开放式泛型注册。当您的具体类也是泛型时,此方法非常有用,因为您不需要为每个类注册类型。
例如,如果您有:
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

正如您所看到的,如果没有开放式泛型注册,我们需要为每个项目单独注册。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接