Как отобразить два разных интерфейса так, чтобы одно значение интерфейса автоматически изменялось, а другое отражалось - PullRequest
1 голос
/ 11 июня 2019

У меня есть ядро, в котором интерфейс объявлен как

    public interface IRequestProvider
    {
        int SomeId { get; set; }
    }

Реализация также определена в том же слое

и затем у меня есть другой слой Repo layer, в котором я вызываю другой внешний пакет nuget с именем DataAccess layer

в котором я объявил

    public interface IRequestProvider
    {
        int SomeId { get; set; }
        int SomeOtherId { get; set; }
    }

так В ядре и DataAccess оба уровня я определил IRequestProvider

Ламар-код

 public static class SomeRegistry
    {
        public static void RegisterDISome(this ServiceRegistry services, IConfigurationRoot configurationRoot)
        {

            services.For<IRequestProvider>().Use<RequestProvider>().Scoped();

            services.For<DataAccessInterfaces.IRequestProvider>().Use<DataAccessModel.RequestProvider>().Scoped();

        }
    }

Использование Scoped для передачи одного и того же экземпляра в запросе

Automapper включен

 public class DomainToRepoMappingsProfile : Profile
    {
        public DomainToRepoMappingsProfile()
        {
            this.CreateMap<IRequestProvider, DataAccess.IRequestProvider>()
                .ForMember(dst => dst.SomeOtherId, opt => opt.Ignore());
        }
    }

Я ожидаю, что когда я изменю что-либо в Core.IRequestProvider из любого слоя, это должно автоматически отражаться в слое DataAccess.IRequestProvider

В настоящее время я каждый раз вызываю IDomainToRepoMappingRequestProvider.map () для установки DataAccess.IRequestProvider

 public class DomainToRepoMappingRequestProvider : IDomainToRepoMappingRequestProvider
    {
        private readonly IMapper _mapper = null;
        private readonly IRequestProvider _requestProvider = null;
        private DataAccess.IRequestProvider _dataAccessRequestProvider = null;
        public DomainToRepoMappingRequestProvider(IRequestProvider requestProvider, DataAccess.IRequestProvider dataAccessRequestProvider, IMapper mapper)
        {
            _mapper = mapper;
            _requestProvider = requestProvider;
            _dataAccessRequestProvider = dataAccessRequestProvider;
        }
        public void Map()
        {
            _mapper.Map(_requestProvider, _dataAccessRequestProvider);
        }
    }

Я нашел решение для автоматического отражения изменений при изменении чего-либо без вызова map ()

1 Ответ

0 голосов
/ 11 июня 2019

Как насчет того, чтобы установщик свойства в реализации IRequestProvider вызывал маппер для вас? Получатели и установщики свойств могут использоваться для гораздо большего, чем просто установка частного вспомогательного поля. Пример:

public class RequestProvider : IRequestProvider
{
    private readonly _mappingProvider;
    private int _someId;

    public RequestProvider(IDomainToRepoMappingRequestProvider mappingProvider)
    {
        _mappingProvider = mappingProvider
    }

    public int SomeId
    {
        get;
        set 
        {
            _someId = value;
            _mappingProvider.Map();
        }
    }
}
...