Внедрить AutoMapper в конструктор уровня сервисаC#

Место общения программистов C#
Anonymous
Внедрить AutoMapper в конструктор уровня сервиса

Сообщение Anonymous »

У меня есть приложение asp net core mvc с уровнями Интернета, сервисов и доступа к данным. В настоящее время я использую AutoMapper в своих конструкторах сервисов следующим образом:

Код: Выделить всё

private readonly ApplicationDbContext data;
private readonly IMapper mapper;

public WorkoutService(ApplicationDbContext data)
{
this.data = data;
this.mapper = AutoMapperConfig.CreateMapper();
}
Вот мой статический класс AutoMapperConfig:

Код: Выделить всё

namespace SoldierTrack.Services.Common
{
using AutoMapper;

public static class AutoMapperConfig
where T : Profile, new()
{
public static IMapper CreateMapper()
{
var mapConfiguration = new MapperConfiguration(config =>
{
config.AddProfile();
});

return mapConfiguration.CreateMapper();
}
}
}
Итак, в каждой службе я жестко кодирую конкретный профиль картографа, используя дженерики. Мой вопрос: как я могу внедрить его, чтобы следовать шаблону DI?
Я попробовал это:
Я реорганизовал AutoMapperConfig следующим образом:

Код: Выделить всё

public static class AutoMapperConfig
{
public static IMapper Initialize()
{
var config = new MapperConfiguration(cfg =>
{
cfg.AddProfile();
cfg.AddProfile();
cfg.AddProfile();
cfg.AddProfile();
});

return config.CreateMapper();
}
}
так что я могу добавить сюда все профили, которые позволят мне внедрить их в сервисы:

Код: Выделить всё

public class MembershipService
{
private readonly ApplicationDbContext data;
private readonly IMapper mapper;

public MembershipService(ApplicationDbContext data, IMapper mapper)
{
this.data = data;
this.mapper = mapper;
}
}
и, наконец, я добавил AutoMapperConfig в свой IoC:

Код: Выделить всё

 public static IServiceCollection AddApplicationServices(this IServiceCollection services)
{
var mapper = AutoMapperConfig.Initialize();
services.AddSingleton(mapper); //I have added this two lines

services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();

return services;
}
Произошло следующее: теперь все мои профили карт на веб-слое перестали работать, и я начал получать такие исключения, как:

Код: Выделить всё

An unhandled exception occurred while processing the request.
AutoMapperMappingException: Missing type map configuration or unsupported mapping.

Mapping types:
CreateWorkoutViewModel -> WorkoutServiceModel
SoldierTrack.Web.Areas.Administrator.Models.Workout.CreateWorkoutViewModel -> SoldierTrack.Services.Workout.Models.WorkoutServiceModel
независимо от того, что я зарегистрировал сопоставление CreateWorkoutViewModel -> WorkoutServiceModel, вот как я регистрирую AutoMapper на веб-уровне:

Код: Выделить всё

builder.Services.AddAutoMapper(typeof(Program).Assembly);

Я пытался изменить регистрацию как Transient и Scoped, но проблема все та же.
Итак, я вернул свой код, как в исходном состоянии.

Подробнее здесь: https://stackoverflow.com/questions/790 ... onstructor

Вернуться в «C#»