2016-03-20 80 views
1

我們一直在使用Automapper,並且我們認爲這是非常棒的實用工具,感謝您創建它!如何使用Automapper映射到內部屬性?

但是,我們有一個問題:

問題

「你怎麼配置AutoMapper到源屬性映射到內部目的地的財產?」

背景

在我們的分層架構中,DTO對象永遠不會離開數據訪問層,只有域對象可以進出通過數據訪問層。因此,從域POV中,域對象不應包含任何數據庫知識。但是,實際上數據庫ID是非常有用的 - 預計'業務層'開發人員不應該知道它們。

解決方案:將數據庫ID添加到域對象,但將它們作爲內部銷售,以便它們不會暴露於「業務層」。接下來將公共層(擁有域對象)內部公開給數據訪問層。問題解決了。預計我們無法弄清楚如何讓Automapper(> v3.3.0)與我們的內部屬性一起工作。

在,版本3.3.0 BindingFlags被暴露,用來解決問題。

Common.Dll

public class Person 
{ 
    public Parent Father { get; set; } 
    internal int FatherId {get; private set; } 
} 

DataAccess.dll

internal class PersonDto 
{ 
    public ParentDto Father { get; set; } 
    public int FatherId {get; private set; } 
} 

在我們的檔案類,所以必須CreateMap<PersonDto, Person>();

編輯1 - 修正了父類返回類型的錯字。

編輯2 - 增加了更多的信息.​​.

在Common.Dll,我們有服務是這樣的:

public class ParentService 
{ 
    public Parent GetFather(Person person) 
    { 
     return repo.Parents.FirstOrDefault(parent => parent.Id = person.Father.Id); 
    } 
} 

而在Business.Dll我們有開發者的使用服務這樣的事情:

var father = parentService.GetFather(son); 
// use father separately or assign it to the son. Like so: 
// son.Father = father; 

重點是,我們不希望業務開發人員有權訪問來自Businssess.Dll的也不能訪問創建域對象的Dto對象。因此,所有'數據庫'知識都封裝在各種Common.dll服務或DataAccess.dll中。

謝謝。

回答

0

這個問題的答案是here

我引用的答案爲您提供便利:

只需設置你的配置對象 的ShouldMapProperty財產initialize方法。

下面是一個使用靜態API的示例,但是,您應該能夠通過使用非靜態API以類似的方式實現 。

Mapper.Initialize(i => 
{ 
    i.ShouldMapProperty = p => p.GetMethod.IsPublic || p.GetMethod.IsAssembly; 
    i.CreateMap<Source, Target>();     
}); 
相關問題