我正在使用带有接口(interface)的存储库模式,我正在使用结构图以便在它们之间进行映射。
在我的 global.asax 中我定义了:
ObjectFactory.Initialize(x =>
{
x.For<IUnitOfWorkFactory>().Use<EFUnitOfWorkFactory>();
x.For(typeof(IRepository<>)).Use(typeof(EFRepository<>)
}
);
现在我想向 MyEntity 实体添加另一个数据库方法。所以我创建了 MyEntityRepository:
class MyEntityRepository:EFRepository<MyEntity>, IMyEntityRepository {
public void CloseCall(long callId) {
....
....
}
}
但是现在,我强制在structuremap 的初始化中添加了一个新行。我有很多这样的情况,而且structuremap初始化的行数越来越大。
此外,大多数情况只是一种方法添加,但这种单一方法添加需要新存储库的接口(interface)、新文件中的实现以及结构图的另一次初始化 - 一种方法需要大量工作。
我该如何解决这个问题?
我做错了什么吗?
也许最好使用 Repository 的扩展方法(如果有这样的东西扩展到 generic..)?
最佳答案
如果你有特殊的接口(interface),必须用特殊类型解析,你必须总是在某处写代码来初始化它。如果您不想在 StructureMap 初始化中编写太多代码,请为 DAL 层使用抽象工厂模式:
工厂接口(interface):
public interface IDalFactory
{
IXXXRepository XXXRepository { get; }
IYYYRepository YYYRepository { get; }
}
实现:
public class DalFactory : IDalFactory
{
private IXXXRepository _xxxRepository;
public IXXXRepository XXXRepository
{
return _xxxRepository ?? (_xxxRepository = new XXXRepository());
}
private IYYYRepository _yyyRepository;
public IYYYRepository YYYRepository
{
return _yyyRepository ?? (_yyyRepository = new YYYRepository());
}
}
然后您将初始化您的 IoC:
ObjectFactory.Initialize(x =>
{
x.For<IUnitOfWorkFactory>().Use<EFUnitOfWorkFactory>();
x.For<IDalFactory>().Use<DalFactory>();
}
);
专用代码总是需要在某个地方进行自己的注册,除非您构建一些自动注册,它将使用反射搜索您的程序集并通过一些命名约定注册存储库。
关于c# - 默认存储库类的扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5784852/