Dependency injection AutoMapper和MEF-如何让AutoMapper在仅指定接口时实现特定类型

Dependency injection AutoMapper和MEF-如何让AutoMapper在仅指定接口时实现特定类型,dependency-injection,automapper,mef,Dependency Injection,Automapper,Mef,我正在使用AutoMapper在我的应用程序的不同级别中存在的实体之间自动映射属性 一切都很顺利,直到我尝试在业务实体中引入新的计算属性值,属性从数据实体自动映射:目标业务实体中的新计算属性值每次都返回null 我使用MEF进行依赖项注入,因此在使用AutoMapper时为源和目标类型指定接口 我认为发生的事情是AutoMapper正在使用指定接口创建目标类的简单实现(因此,该接口将没有计算属性的实现代码,因此返回null,这就是我所看到的),而不是由MEF根据指定目标接口的MEF导出定义创建相

我正在使用AutoMapper在我的应用程序的不同级别中存在的实体之间自动映射属性

一切都很顺利,直到我尝试在业务实体中引入新的计算属性值,属性从数据实体自动映射:目标业务实体中的新计算属性值每次都返回null

我使用MEF进行依赖项注入,因此在使用AutoMapper时为源和目标类型指定接口

我认为发生的事情是AutoMapper正在使用指定接口创建目标类的简单实现(因此,该接口将没有计算属性的实现代码,因此返回null,这就是我所看到的),而不是由MEF根据指定目标接口的MEF导出定义创建相应的目标类

我根本不知道该如何进行

定义数据实体

我的数据实体界面:

public interface IMyDataEntity
{
    string MyProperty1 { get; set; }
}
public interface IMyBusinessEntity
{
    string MyProperty1 { get; set; }
    string MyCalculatedProperty1 { get; }
}
数据实体接口的实现,还定义了MEF使用的接口/实现之间的关联:

[Export(typeof(IMyDataEntity))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class MyDataEntity: IMyDataEntity
{
    public string MyProperty1 { get; set; }
}
[Export(typeof(IMyBusinessEntity))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class MyBusinessEntity: IMyBusinessEntity
{
    public string MyProperty1 { get; set; }
    public string MyCalculatedProperty1 { 
        get{ return "Test"; }
    }
}
定义业务实体

我的业务实体界面:

public interface IMyDataEntity
{
    string MyProperty1 { get; set; }
}
public interface IMyBusinessEntity
{
    string MyProperty1 { get; set; }
    string MyCalculatedProperty1 { get; }
}
业务实体接口的实现,还定义了MEF使用的接口/实现之间的关联:

[Export(typeof(IMyDataEntity))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class MyDataEntity: IMyDataEntity
{
    public string MyProperty1 { get; set; }
}
[Export(typeof(IMyBusinessEntity))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class MyBusinessEntity: IMyBusinessEntity
{
    public string MyProperty1 { get; set; }
    public string MyCalculatedProperty1 { 
        get{ return "Test"; }
    }
}
使用AutoMapper进行映射

尝试从数据实体映射到业务实体:

IMyBusinessEntity myBusinessEntity 
= Mapper.Map<IMyDataEntity, IMyBusinessEntity>(myDataEntity,
            opts => opts.CreateMissingTypeMaps = true);
IMyBusinessEntity我的businessentity
=Mapper.Map(myDataEntity,
opts=>opts.CreateMissingTypeMaps=true);
问题


myBusinessEntity.MyCalculatedProperty1返回null。

您没有获得计算值的原因是因为您在“字符串MyCalculatedProperty1{get;}”中没有setter。为什么我需要计算属性的setter?我认为计算值来自IMyDataEntity my bad。但是“Mapper.Map”对您不起作用,因为IMyBusinessEntity是一个接口,并且您的计算属性属于concert类“MyBusinessEntity”。您必须更改映射。在“创建映射到具体类,然后映射到具体类Mapper.CreateMap,然后映射到Mapper.Mapper”中,您没有获得计算值的原因是因为您在“字符串MyCalculatedProperty1{get;}”中没有setter,为什么我需要计算属性的setter?我认为计算值来自IMyDataEntity my bad。但是“Mapper.Map”对您不起作用,因为IMyBusinessEntity是一个接口,并且您的计算属性属于concert类“MyBusinessEntity”。您必须更改映射。在“创建映射到具体类”中,然后使用具体类Mapper.CreateMap和Mapper.map进行映射