2011-12-02 18 views
13

AutoMapperを使用してプライベートセッターでプロパティを割り当てることは可能ですか?あなたはこのプライベートセッターを使用したAutoMapperマッピングプロパティ

public class RestrictedName 
{ 
    public RestrictedName(string name) 
    { 
     Name = name; 
    } 

    public string Name { get; private set; } 
} 

public class OpenName 
{ 
    public string Name { get; set; } 
} 

のようなコンストラクタでこのプロパティの値を設定する場合

+0

あなたがAutomapperのどのバージョンを使用していますか?あなたはそれをやってみましたか? – PatrickSteele

+8

@blockhead実際、それは非常に重要な質問です。不変オブジェクトは、(設定者を公開することによって)自由に変更できるオブジェクトよりもはるかに優れた建築慣行です。これは、Entity Frameworkが最近、プライベートプロパティに水分補給する機能を追加し、ドメインモデルが最初の水分補給後に不変のままになることを可能にする正確な理由です。おそらく、彼らの建築をブラッシュアップする必要があるのは、レソリヤではありません。 ;) – Marchy

+0

すみません。プライベートプロパティはプライベートであるはずです。それはオブジェクトに属するデータであり、オブジェクトだけが知っているので、そのデータについて知っておく必要があります。 – blockhead

答えて

15

あなたは、このコード

var openName = new OpenName {Name = "a"}; 
var restrictedName = Mapper.Map<OpenName, RestrictedName>(openName); 
Assert.AreEqual(openName.Name, restrictedName.Name); 
+2

これは最新バージョンでは必要ないようです。私はプライベートセッターを持つクラスにマップすることができます。内部で反射を使用している必要があります。 – Monstieur

+0

@ Locutusたぶんあなたはそのコメントを回答にすることができますか?おそらく、この質問に対する新しい答えとしてマークする必要があります。 – julealgon

9

で動作します。この

Mapper.CreateMap<OpenName, RestrictedName>() 
      .ConstructUsing(s => new RestrictedName(s.Name)); 

ようConstructUsingを使用することができますAutoMapperではプライベートセッターでプロパティをマップすることができるようになりました。リフレクションを使用してオブジェクトを作成しています。

例クラス:

public class Person 
{ 
    public string Name { get; set; } 
    public string Surname { get; set; } 
} 


public class PersonDto 
{ 
    public string Fullname { get; private set; } 
} 

とマッピング:

AutoMapper.Mapper.CreateMap<Person, PersonDto>() 
    .ForMember(dest => dest.Fullname, conf => conf.MapFrom(src => src.Name + " " + src.Surname)); 

var p = new Person() 
{ 
    Name = "John", 
    Surname = "Doe" 
}; 

var pDto = AutoMapper.Mapper.Map<PersonDto>(p); 

AutoMapperは問題なくプライベートセッターとプロパティをマッピングします。カプセル化を強制する場合は、IgnoreAllPropertiesWithAnInaccessibleSetterを使用する必要があります。このオプションを使用すると、すべてのプライベートプロパティ(およびその他のアクセスできない)は無視されます。

AutoMapper.Mapper.CreateMap<Person, PersonDto>() 
    .ForMember(dest => dest.Fullname, conf => conf.MapFrom(src => src.Name + " " + src.Surname)) 
    .IgnoreAllPropertiesWithAnInaccessibleSetter(); 

Silverlightを使用する場合、問題が発生します。 MSDNによると:https://msdn.microsoft.com/en-us/library/stfy7tfc(v=VS.95).aspx

In Silverlight, you cannot use reflection to access private types and members. 
3

#600 Private/internal destination propertiesを参照してください。

ソリューション:

public class PrivateInternalProfile { 
    protected override Configure() { 
     ShouldMapField = fieldInfo => true; 
     ShouldMapProperty = propertyInfo => true; 
     CreateMap<User, UserDto>(); //etc 
    } 
} 
関連する問題