如何映射两个不同的接口,以便一个接口值自动更改,另一个应该得到反映
How to map two different Interface such that one Interface value get change automatically other should get reflected
我有核心,其中接口声明为
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();
}
}
范围内用于在整个请求中传递相同的实例
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() 的情况下自动反映更改
在 IRequestProvider
的实现中让 属性 setter 为您调用映射器如何? 属性 getter 和 setters 可以用来做比设置私有支持字段更多的事情。一个例子:
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();
}
}
}
我有核心,其中接口声明为
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();
}
}
范围内用于在整个请求中传递相同的实例
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() 的情况下自动反映更改
在 IRequestProvider
的实现中让 属性 setter 为您调用映射器如何? 属性 getter 和 setters 可以用来做比设置私有支持字段更多的事情。一个例子:
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();
}
}
}