将Automapper与泛型一起使用

时间:2015-12-09 23:49:02

标签: c# automapper

我有一个基类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基类?

1 个答案:

答案 0 :(得分:0)

存储库模式查询时混合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));
    }
}