默认存储库类的扩展
本文关键字:扩展 存储 默认 | 更新日期: 2023-09-27 17:53:07
我正在使用带有接口的存储库模式,并且我正在使用structuremap以便在它们之间进行映射。
在我的全局。
ObjectFactory.Initialize(x =>
{
x.For<IUnitOfWorkFactory>().Use<EFUnitOfWorkFactory>();
x.For(typeof(IRepository<>)).Use(typeof(EFRepository<>)
}
);
现在我想添加另一个db方法到MyEntity实体。所以我创建了MyEntityRepository:
class MyEntityRepository:EFRepository<MyEntity>, IMyEntityRepository {
public void CloseCall(long callId) {
....
....
}
}
但是现在,我不得不在structuremap的初始化中添加新的一行。我遇到过很多这样的情况structuremap初始化的行数越来越大。
此外,大多数情况下只添加了一个方法,但这一个方法的添加需要为新存储库提供接口,在新文件中实现,并再次初始化structuremap -一个方法需要做很多工作。
我该如何解决这个问题?
我做错了什么吗?
也许最好使用扩展方法到存储库(如果有这样的东西扩展到通用…)?
如果你有特殊的接口,必须用特殊类型解析,你必须总是在某个地方写代码来初始化它。如果您不想在StructureMap初始化中编写太多代码,请为DAL层使用抽象工厂模式:
工厂接口: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>();
}
);
专用代码总是需要在某个地方注册,除非你构建了一些自动注册,它将通过一些命名约定搜索带有反射和寄存器库的程序集。
在我的业务层中,我定义了我创建的IRepository接口:
public abstract class BaseRepository<T> : IRepository<T> where T : IDataEntity
{
protected IRepository<T> Repository { get; set; }
public BaseRepository()
{
Repository = ObjectFactory.GetInstance<IRepository<T>>();
}
public virtual IQueryable<T> GetQuery()
{
return Repository.GetQuery();
}
public virtual IQueryable<T> GetQuery(params Expression<Func<T, object>>[] includes)
{
return Repository.GetQuery(includes);
}
public virtual void Insert(T entity)
{
Repository.Insert(entity);
}
public virtual void Update(T entity)
{
Repository.Update(entity);
}
public virtual void Delete(T entity)
{
Repository.Delete(entity);
}
public virtual void Attach(T entity)
{
Repository.Attach(entity);
}
}
在全局。我必须将IRepository映射到实体框架实现。
现在对于每个我想要公开到网络上的类,我必须定义:
public class MyEntityRepository: BaseRepository<MyEntity> {
....
Common queries for this entity
....
....
overrides of insert, delete and so on
}
现在,我不能在web应用程序中使用BaseRepository,而是使用属于实体的存储库。我也不需要在structuremap中注册存储库的每个扩展。唯一的事情是,我必须记住不要直接使用EFRepository(我可以使用结构映射获得它-我必须避免使用它)。