c# - 将具有定义类型的通用接口(interface)注册为没有类型的通用接口(interface)有什么区别?

标签 c# ioc-container

我有一个关于如何在我的 UnityContainer 中将实现的通用接口(interface)注册到多个类中的问题我用这段代码弄明白了。

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. 如果我有此代码,最佳做法是什么?

最佳答案

第二种方法名为开放通用注册。当您的具体类也是通用的时,此方法很有用,您不需要为每个类注册一个类型。

例如,如果您有:

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

如您所见,在没有开放通用注册的情况下,我们需要为每个项目单独注册

关于c# - 将具有定义类型的通用接口(interface)注册为没有类型的通用接口(interface)有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31650302/

相关文章:

c# - 数据记录内的列表为空

c# - protobuf-net 不支持指定的方法

design-patterns - 我们是否有效地使用了 IoC?

java - MentaContainer 上的自动布线不起作用?

php - Ioc 容器和动态语言(第 2 课)

c# - 在 PDFsharp 中打开文档

c# - 通用多层数据访问模式?

C# 图像识别性能——比较图像列表和图像字典

c# - IoC 实例化最晚时间可能

c# - 是否可以在不传递容器的情况下在 CaSTLe Windsor 中使用范围限定的生活方式?