关于存储库模式的架构决策(它使用Automapper)

时间:2014-06-13 10:50:04

标签: entity-framework architecture automapper repository-pattern

我有:

  1. 域模型(模型)
  2. 数据库实体(实体)
  3. 存储库:接受模型并将其转换为数据库实体(使用automapper)并将其保存到数据库中。在某些情况下,返回一个Model对象。
  4. 示例:

    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)之间的映射。

    我要求的是有效的吗?或者我的要求是荒谬的吗?

    注意:我认为我的业务层不应该引用数据库实体,因为我不希望任何人直接使用数据库实体。他们应该只使用模型类。

1 个答案:

答案 0 :(得分:-1)

所以答案很简单。开始时有点愚蠢的问题。 IRep的声明是错误的。

BaseRep<T,U>:IRep<T> instead of IRep<T, U>.
  1. rep界面应为:

    public interface IRepository<T>
        where T : class
    {
        void Insert(T model);           
        IEnumerable<T> GetAll();
    }
    
  2. 基础存储库应为:

        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);
        }
    }
    
  3. 在业务层:

    public class BizLayer 
    {
        public List<EmployeeModel> GetEmployee(IRepository<EmployeeModel> rep)
        {
            return rep.GetAll();
        }    
     }
    
  4. 从演示文稿或应用程序根目录中注入依赖项:

    bizlayer.GetEmployees(new IRepository<EmployeeModel, EmployeeEntity>())