Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用接口与具体映射的自动映射_C#_Interface_Automapper_Automapper 2 - Fatal编程技术网

C# 使用接口与具体映射的自动映射

C# 使用接口与具体映射的自动映射,c#,interface,automapper,automapper-2,C#,Interface,Automapper,Automapper 2,我认为这是不可能的,但我想这个问题值得一提 我有以下类型共享一个接口(我保证,这不是我以前问过的问题) 然后,我有以下映射: Mapper.Map<ICustomer, ICustomer>(); 现在,通常情况下,只要在定义了两个接口类型的第一个Map语句中键入,我就不会有问题,但我的问题是当客户对象埋在某个地方时 public class CustomerOrderDTO { ICustomer customer; } public class CustomerOrd

我认为这是不可能的,但我想这个问题值得一提

我有以下类型共享一个接口(我保证,这不是我以前问过的问题)

然后,我有以下映射:

Mapper.Map<ICustomer, ICustomer>();
现在,通常情况下,只要在定义了两个接口类型的第一个Map语句中键入,我就不会有问题,但我的问题是当客户对象埋在某个地方时

public class CustomerOrderDTO
{
    ICustomer customer;
}

public class CustomerOrderSO
{
    CustomerSO customer;
}

Mapper.Map<CustomerOrderDTO, CustomerOrderSO>();
公共类CustomerOrderTo
{
i客户;
}
公共类CustomerOrderSO
{
顾客对顾客;
}
Map();
这不起作用,因为没有从ICCustomer到CustomerSO的映射,所以配置断言失败

目前,我正在通过以下方式解决这个问题:

Mapper.CreateMap<CustomerOrderDTO, CustomerOrderSO>()
    .ForMember(desc => dest.customer
        , exp => exp.MapFrom(src => Mapper.Map<ICustomer, ICustomer>(src.customer
            , new CustomerSO));
Mapper.CreateMap()
.ForMember(desc=>dest.customer
,exp=>exp.MapFrom(src=>Mapper.Map(src.customer
新客户),;
然而,我必须对我们拥有的每一个DTO类型对象都这样做,然后很可能产生级联效应

我理解,从技术上讲,我可以采取以下措施来解决问题:

Mapper.Map<CustomerBO, CustomerSO>();
Mapper.Map();
然而,在CustomerBO中,有许多其他属性用于业务逻辑中,而不是接口中。同样,CustomerBO中有许多属性不在接口中。如果我按照上述路线,我将有大量的Ignore()调用,我必须将CustomerBO映射到CustomerSO,然后将CustomerSO映射到CustomerBO,每个都有自己唯一的忽略调用列表。使用接口可以消除忽略调用的需要,因为我希望从一个接口到另一个接口可见的数据是在接口中定义的


因此,简而言之,我的问题是:当AutoMapper遇到一个实现类时,是否有某种方法可以告诉它使用接口映射?如果没有,是否还有其他方法(阅读:更好)与MapFrom委托中的映射调用不同,它可以根据需要强制执行我的接口到接口映射?

通常,您希望配置到
ICCustomer
接口的映射,并使用
.as()
覆盖目标类型(可能这是您第一次提出问题后添加的内容)

这适用于两个层之间的映射,如您的示例:

Mapper.CreateMap<CustomerDTO, ICustomer>().As<CustomerModel>();
Mapper.CreateMap<CustomerModel, ICustomer>().As<CustomerDTO>();
Mapper.CreateMap().As();
Mapper.CreateMap().As();
但是,将其扩展到另一个层,例如将
CustomerModel
映射到
CustomerViewModel
,这是不完整的。您只能告诉AutoMapper一种目标类型用于实例化


但与上面的评论类似,我会质疑将属性类型化为这些其他类中的接口的原因。为什么
CustomerOrderModel
应该有
ICCustomer客户
属性?你能用
CustomerTo
的实例替换customer,并且你的程序仍然正确吗如果您对包含客户的对象有共同行为,您可以让这些父对象实现接口,
ICCustomerAccessor
。然后,使用添加较弱的类型属性,它就不必干扰名称。

我一直在考虑您的问题。这是个好问题,但我怀疑您是否应该这样做问题是:通过将对象映射为接口,您将创建不完整的对象。这意味着您应该始终知道对象来自何处和/或写入逻辑,以检查属性是否为NULL。AutoMapper是为了便于与DTO一起工作。我认为DTO不完全是反模式。(尽管很容易重复使用和妥协)。因此,例如,您的
CustomerOrderTo
应该包含一个专用的
CustomerTo
,而不是一个接口。好吧-我的意见:)。不幸的是,DTO只是一个例子。我们不使用DTO。相反,我们三层中的对象共享一个或多个接口。BOs有工厂可以接受接口(我在验证后使用这些接口进行映射)。BOs从DAL发出请求,DAL返回适当的接口(如果需要)然后这些被映射到现有的BOs。没有用于在层之间传输数据的DTO库。我看到了使用它们的好处,但它目前超出了我进行重构/重写的时间范围。我不确定这个断言是否总是正确的,“通过将对象映射为接口,您正在创建不完整的对象”,尤其是对于DTO。我的意思是,如果您对描述行为的接口要求严格(因此,没有状态),那么当然,您的对象将是不完整的,但这只是因为它们将没有任何属性,只有方法。作为DTO,只有方法的对象是无用的。此外,如果
类MyDTO:Imydto{}
接口Imydto{Imyprop myprop{get;set;}
,那么
MyDTO
必须包含
public-Imyprop-myprop{get;set;}
(在纯粹的设计思想之外,我看不到这会造成任何基本的障碍或问题。这可能需要一些很好的例子:1)版本化、轻量级接口更可取的跨域应用程序。2)试图欺骗多重继承,例如,如果您希望跨实体框架模型的特定子集执行公共动态操作。3)通过MEF加载数据。)
Mapper.CreateMap<CustomerOrderDTO, CustomerOrderSO>()
    .ForMember(desc => dest.customer
        , exp => exp.MapFrom(src => Mapper.Map<ICustomer, ICustomer>(src.customer
            , new CustomerSO));
Mapper.Map<CustomerBO, CustomerSO>();
Mapper.CreateMap<CustomerDTO, ICustomer>().As<CustomerModel>();
Mapper.CreateMap<CustomerModel, ICustomer>().As<CustomerDTO>();