Как я могу внедрить Auto Mapper непосредственно в слой хранилища, под контроллером - PullRequest
0 голосов
/ 28 ноября 2018

Это проект ASP.net Core 2.1.

Как я могу внедрить Auto Mapper непосредственно в слой репозитория?В настоящее время у меня есть Auto Mapper, внедряемый в контроллер, а затем из контроллера я передаю его в конструкторе на слой Repo.

Можно ли его впрыскивать непосредственно в Repo или это лучшее, что я могу сделать?

Вот мой запуск. ConfigureServices ()

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 Ответ

0 голосов
/ 28 ноября 2018

Пусть структура DI сделает магию за вас.

Начните с регистрации всего, что нужно ввести:

// 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...