建立一个自动化工厂的惯例
本文关键字:化工厂 一个 建立 | 更新日期: 2023-09-27 18:23:44
通过用通用Create
方法定义IDataRepositoryFactory
非通用接口:
public interface IDataRepositoryFactory
{
T Create<T>(DataContext context) where T : IDataRepository; // new non-generic interface
}
我可以避免编写工厂实现:
_kernel.Bind(t => t.FromAssemblyContaining(typeof(DataRepository<>))
.SelectAllInterfaces()
.EndingWith("RepositoryFactory")
.BindToFactory());
_kernel.Bind(t => t.FromAssemblyContaining(typeof(DataRepository<>))
.SelectAllClasses()
.WhichAreNotGeneric()
.EndingWith("Repository")
.BindAllInterfaces());
然而,这种解决方案有优点也有缺点:
优点:
- 不再需要手动实现抽象工厂
缺点:
- 将这个
IDataRepositoryFactory
接口作为依赖项,感觉很像使用服务定位器:- 功能强大的通用工厂可以创建任何存储库类型,甚至是完全不相关模块的命名空间中的存储库类型
- 实际的依赖关系现在隐藏在一个抽象的工厂后面;使用者的构造函数不再静态地记录所需的存储库/工厂
难道没有更好的办法吗?