Как сопоставить свойство типа интерфейса с AutoMapper и Unity - PullRequest
0 голосов
/ 28 апреля 2020

Мы работаем над проектом. 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, это сработает.

...