1

我有核心,其中接口被声明为

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

实现也在同一层定义

然后我有另一个层 Repo 层,我在其中调用另一个名为 DataAccess 层的外部 nuget 包

我在其中宣布

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

所以在核心和数据访问这两个层我都定义了 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();

        }
    }

作用域用于在整个请求中传递相同的实例

自动映射器已启用

 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() 时自动反映更改

4

1 回答 1

0

IRequestProvider在为您调用映射器的实现中拥有一个属性设置器怎么样?属性 getter 和 setter 可以用来做更多的事情,而不仅仅是设置一个私有的支持字段。一个例子:

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();
        }
    }
}
于 2019-06-11T08:45:30.270 回答