我有:
示例:
public class BaseRepository<T, U> : IRepository<T, U>
{
public void Insert(T model)
{
U entity= Mapper.Map<T, U>(model);
dbContext.Set<U>().Add(entity);
dbContext.SaveChanges();
}
}
现在,当从业务层创建存储库对象时,我会将存储库实例化为:
new BaseRepository<Model, Entity>()
问题 现在,这要求业务层可以访问模型和数据库实体项目。我想避免将数据库实体引用到业务层。我的业务层应该能够仅使用域模型来实例化存储库。
new BaseRepository<Model>()
我需要一个存储库
public class BaseRepository<T> : IRepository<T>
但后来我无法找到一种方法来处理模型和实体(automapper)之间的映射。
我要求的是有效的吗?或者我的要求是荒谬的吗?
注意:我认为我的业务层不应该引用数据库实体,因为我不希望任何人直接使用数据库实体。他们应该只使用模型类。
答案 0 :(得分:-1)
所以答案很简单。开始时有点愚蠢的问题。 IRep的声明是错误的。
BaseRep<T,U>:IRep<T> instead of IRep<T, U>.
rep界面应为:
public interface IRepository<T>
where T : class
{
void Insert(T model);
IEnumerable<T> GetAll();
}
基础存储库应为:
public class BaseRepository<T, U> : IRepository<T>
where T : class
where U : class
{
protected readonly IPARS_ADOEntities dbContext;
public BaseRepository()
: this(new IPARS_ADOEntities())
{
}
public BaseRepository(IPARS_ADOEntities dbContext)
{
this.dbContext = dbContext;
}
public void Insert(T model)
{
U entity = Mapper.Map<T, U>(model);
dbContext.Set<U>().Add(entity);
dbContext.SaveChanges();
}
public IEnumerable<T> GetAll()
{
IEnumerable<U> entities = dbContext.Set<U>();
return Mapper.Map<IEnumerable<U>, IEnumerable<T>>(entities);
}
}
在业务层:
public class BizLayer
{
public List<EmployeeModel> GetEmployee(IRepository<EmployeeModel> rep)
{
return rep.GetAll();
}
}
从演示文稿或应用程序根目录中注入依赖项:
bizlayer.GetEmployees(new IRepository<EmployeeModel, EmployeeEntity>())