将Automapper与泛型一起使用
本文关键字:一起 泛型 Automapper | 更新日期: 2023-09-27 18:26:19
我有一个基类Repository,它包含从中继承的一组类(如UserRepository或DepartmentRepository)的基本功能。
我正在使用automapper在实体框架对象和域对象之间进行映射。
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class {
protected readonly DbContext Context;
public Repository(DbContext context) {
Context = context;
}
public TEntity Get(int id) {
return Context.Set<TEntity>().Find(id);
}
}
public class UserRepository : Repository<User>, IUserRepository {
public UserRepository(DbContext context) : base(context) {
}
public User GetUserByNTId(string NTId) {
return Mapper.Map<User>(DbContext.Users.SingleOrDefault(u => u.NTId == NTId));
}
}
GetUserByNTId
将起作用,因为我可以在return语句中使用automapper。但是Get
不起作用,因为它处理TEntity
,我不知道如何告诉automapper检查TEntity
的类型并寻找匹配的映射。
如何更改Get函数的return语句,使其适用于我的所有派生存储库,并且仍然使用automapper?还是我只需要把我所有的通用函数都推到派生类中,并消除Repository基类?
当从存储库模式查询时,混合使用AutoMapper和其他职责是一个非常糟糕的主意。当然,这也违反了单一责任原则。
一个天真的未经测试的实现将是:
public class ExampleOfGenericRepository<TEntity> : Repository<TEntity>
where TEntity : class
{
public ExampleOfGenericRepository(DbContext context)
: base(context)
{
}
public TEntity GetById(int id)
{
return Mapper.Map<TEntity>(Get(id));
}
}