Мы работаем над проектом. Net Core 3.1.
Мы используем AutoMapper для преобразования DTO в объекты модели. + Unity для внедрения зависимостей
DTO:
public class EmployeeDto
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string CompanyName { get; set; }
}
Интерфейсы:
public interface ICompany
{
public string CompanyName { get; set; }
}
public interface IEmployee
{
public string FirstName { get; set; }
public string LastName { get; set; }
public ICompany Company { get; set; }
}
Реализации:
public class Company : ICompany
{
public string CompanyName { get; set; }
}
public class Employee : IEmployee
{
public string FirstName { get; set; }
public string LastName { get; set; }
public ICompany Company { get; set; }
}
Что бы я хотел сделать это:
CreateMap<EmployeeDto, Employee>()
.ForPath(d => d.Company.CompanyName, opt => opt.MapFrom(src => src.CompanyName));
Конечно , я получил ошибку "Не удается создать экземпляр типа интерфейса ... ICompany"
Есть ли способ для AutoMapper использовать средства распознавания Unity для создания экземпляра Company для типа ICompany (зарегистрированного в Unity)? Если да, то как и какой подход может быть наиболее подходящим?
Спасибо за помощь (и простите мой английский sh ^^ не стесняйтесь сказать мне, что вы не понимаете).
PS:
Я искал и пробовал разные, но я немного растерялся ^^
Может быть, мы не должны быть в этой ситуации ...; все советы приветствуются, но спасибо, что имейте в виду основной вопрос:)
ОБНОВЛЕНИЕ
После этой ссылки
Вот как мы регистрировали типы:
public void ConfigureContainer(IUnityContainer container)
{
// Could be used to register more types
container.RegisterType<ICompany, Company>();
container.RegisterType<IEmployee, Employee>();
var config = new MapperConfiguration(cfg =>
{
// this doesn't work
//cfg.ConstructServicesUsing(type => container.Resolve(type));
// this works
cfg.ConstructServicesUsing(t => new Employee() { Company = container.Resolve<ICompany>() });
cfg.AddProfile(typeof(AppProfile));
});
var mapper = config.CreateMapper();
config.AssertConfigurationIsValid();
container.RegisterInstance(typeof(IMapper), mapper);
}
Профиль:
CreateMap<ICompany, Company>()
.ConstructUsingServiceLocator(); // <- this seems to have no effect
CreateMap<IEmployee, Employee>()
.ConstructUsingServiceLocator(); // <- this seems to have no effect
CreateMap<EmployeeDto, Employee>()
.ConstructUsingServiceLocator()
.ForPath(d => d.Company.CompanyName, opt => opt.MapFrom(src => src.CompanyName));
Вы видите способ сделать это более обобщенным c?
cfg.ConstructServicesUsing(t => new Employee() { Company = container.Resolve<ICompany>() });
«Странная вещь»: если я заменю EmployeeDto.CompanyName
на EmployeeDto.CompanyDto
и определю отображение CompanyDto -> Company, это сработает.