2016-03-20 9 views
1

私たちはAutomapperをいつか使ってきました。それは素晴らしいユーティリティだと思っています。しかしAutomapperを使用して内部プロパティにマップする方法は?

、我々は疑問があります。

質問

「をどのようにAutoMapperは、内部宛先プロパティにソースプロパティをマップするために設定しますか。」私たちの階層化アーキテクチャでは

背景

、DTOは、データアクセス層を離れることはないオブジェクト、専用ドメインオブジェクトは、データアクセス層の内外通過を許可されています。したがって、ドメインPOVから、ドメインオブジェクトにはデータベース知識が含まれてはなりません。しかし、実際には、データベースIDは持ち運びには非常に便利です。ビジネス層の開発者はそれらについて知るべきではないと考えています。

解決方法:ドメインオブジェクトにデータベースIDを追加しますが、内部オブジェクトとして販売して、ビジネスレイヤに公開されないようにします。次に、(ドメインオブジェクトを所有する)共通レイヤーを内部のデータアクセスレイヤーに公開します。問題が解決しました。 Automapper(> v3.3.0)を内部プロパティーと連携させる方法を理解することはできません。

Inバージョン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 ServicesまたはDataAccess.dllにカプセル化されています。

ありがとうございました。

答えて

0

この質問に対する回答はhereです。

私はあなたの便宜のための答えを引用:

ちょうどinitializeメソッドであなたの構成オブジェクト のShouldMapPropertyプロパティを設定します。

ここでは静的APIを使用する例を示しますが、非静的APIを使用して同様の方法で同じ結果を得るには、 を使用する必要があります。

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