代码之家  ›  专栏  ›  技术社区  ›  TheColonel26

如何将自动映射器直接插入到控制器下方的存储库层

  •  0
  • TheColonel26  · 技术社区  · 7 年前

    这是一个ASP.net核心2.1项目。

    如何将自动映射器直接注入存储库层?目前,我将自动映射器注入控制器,然后从控制器将其传递到构造函数中的Repo层。

    有可能将其直接注入回购,或者这是我能做的最好的方式?

    public void ConfigureServices(IServiceCollection services)
    {
        //** other stuff is here
    
    
    
        // Auto Mapper Configurations
        var mappingConfig = new MapperConfiguration(mc =>
        {
            mc.AddProfile(new MappingProfile());
        });
    
        IMapper mapper = mappingConfig.CreateMapper();
        services.AddSingleton(mapper);
    
    }     
    

    这是一个控制器

    [Route("api/[controller]")]
    public class EmployeesController : Controller
    { 
        EmployeesRepo _repo;
    
        public EmployeesController(IMapper mapper)
        {
            _repo = new EmployeesRepo(mapper);
        }
    
        // GET: Jobs
        [HttpGet("[action]")]
        public IEnumerable<EmployeeDTO> GetAll()
        {
            //** TODO Fix Later hack for debug
            var employees = _repo.GetLast(100);
            return employees;
        }
    }
    

    这是一个回购类

    public class EmployeesRepo
    {
        EFContext db = new EFContext();
    
        protected readonly IMapper _mapper;
    
        // Assign the object in the constructor for dependency injection
        public EmployeesRepo(IMapper mapper)
        {
            _mapper = mapper;
        }
    
        public IEnumerable<EmployeeDTO> GetAllEmployees()
        {
            return db.Employees.ProjectTo<EmployeeDTO>(_mapper.ConfigurationProvider).ToList();
        }
    
        internal IEnumerable<EmployeeDTO> GetLast(int v)
        {
           return db.Employees.ProjectTo<EmployeeDTO>(_mapper.ConfigurationProvider).ToList();
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   sellotape    7 年前

    首先注册需要注入的所有内容:

    // You can lazily create the IMapper, or if you prefer, use
    // a concrete value.
    services.AddSingleton<IMapper>(sp => mappingConfig.CreateMapper());
    
    // Make your EmployeesRepo implement IEmployeesRepo
    services.AddTransient<IEmployeesRepo, EmployeesRepo>();
    
    // I'm guessing but you'll have the connection string somewhere like this.
    // Also using a DbContextPool instead has benefits (though not required)
    services.AddDbContextPool<EFContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Data")));
    

    IEmployeesRepo _repo;
    
    public EmployeesController(IEmployeesRepo repo)
    {
        _repo = repo;
    }
    

    private readonly EFContext _db;
    private readonly IMapper _mapper;
    
    // Assign the object in the constructor for dependency injection
    public EmployeesRepo(EFContext db, IMapper mapper)
    {
        _db = db;
        _mapper = mapper;
    }
    
    推荐文章