我不认为这是可能的,但我想这是值得的.
我有以下类型共享一个接口(我保证,这不是我以前问过的同一个问题).
public interface ICustomer;
public class CustomerBO : ICustomer
public class CustomerSO : ICustomer // SO is Service Object in this case.
Run Code Online (Sandbox Code Playgroud)
然后,我有以下映射:
Mapper.Map<ICustomer, ICustomer>();
Run Code Online (Sandbox Code Playgroud)
现在,这里变得有趣/令人困惑.
这有效:
Mapper.Map<ICustomer, ICustomer>(customerSO, new CustomerBO);
Run Code Online (Sandbox Code Playgroud)
这不起作用:
Mapper.Map(customerSO, new CustomerBO());
Run Code Online (Sandbox Code Playgroud)
现在,通常我只是在键入第一个定义了两个接口类型的Map语句时就没有问题了,但我的问题是当Customer对象被隐藏在某个地方时.
public class CustomerOrderDTO
{
ICustomer customer;
}
public class CustomerOrderSO
{
CustomerSO customer;
}
Mapper.Map<CustomerOrderDTO, CustomerOrderSO>();
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为没有从ICustomer到CustomerSO的映射,因此配置断言失败.
目前,我正在解决这个问题:
Mapper.CreateMap<CustomerOrderDTO, CustomerOrderSO>()
.ForMember(desc => dest.customer
, exp => exp.MapFrom(src => Mapper.Map<ICustomer, ICustomer>(src.customer
, new CustomerSO));
Run Code Online (Sandbox Code Playgroud)
但是,我必须为我们拥有的每个DTO类型的对象执行此操作,然后很可能具有级联效果.
据我所知,从技术上讲,我可以执行以下操作来解决此问题:
Mapper.Map<CustomerBO, CustomerSO>();
Run Code Online (Sandbox Code Playgroud)
但是,在CustomerBO中,业务逻辑中使用的许多其他属性不在接口中.同样,CustomerSO中有很多属性不在界面中.如果我使用上述路线,我会有大量的Ignore()调用,我必须将CustomerBO映射到CustomerSO,然后将CustomerSO映射到CustomerBO,每个都有自己唯一的Ignore调用列表.使用接口消除了对Ignore调用的需要,因为我希望在接口中定义从一个到另一个可见的数据.
所以,简而言之,我的问题是:有什么方法可以告诉AutoMapper在遇到其中一个实现类时使用接口映射?如果不这样做,是否有一些其他(读取:更好)的方式比MapFrom委托中的Map调用方式能够根据需要强制执行我的接口到接口映射?
我想说这是查询,但事实并非如此.即使我们一步一步地完成它,查询也顺利完成.即使.DataBind()方法也不会导致延迟.
以下是我知道它与我的IQueryable作为绑定源的关系:
旧代码:
对代码的这种可怕的歪曲将在IE中很快完成.也许是思考时间的第二或第二.
这是新的代码,在肉体中:
IQueryable<Expose_LotRuns> elr = DB.Expose_LotRuns;
if (iTechID > 0)
elr = elr.Where(x => x.Master_LotRuns.Flows.CD_Techs.ID == iTechID);
if (iFlowID > 0)
elr = elr.Where(x => x.Master_LotRuns.Flows.ID == iFlowID);
if (iToolID > 0)
elr = elr.Where(x => x.Master_LotRuns.Tools.ID == iToolID);
if (iOperationID > 0)
elr = elr.Where(x => x.Master_LotRuns.Operations.ID == iOperationID);
if (iReticleID > 0)
elr = elr.Where(x => x.Reticles.ID == iReticleID);
var techs = from x in …
Run Code Online (Sandbox Code Playgroud)