ライセンス - c# automapper 使い方




同じ2つのオブジェクトタイプ間に2つのAutomapperマップを作成する (2)

Kevin Kalitowskiはwalの答えについて良い点を挙げました。異なるマッピングを扱うために2つの構成が必要な場合は、他のすべてのマッピングを複製する必要はありませんか?

私は、プロファイルを使用してこれを回避する方法を見つけたと思います。一意のマッピングごとに1つのプロファイルを持ち、共通のマッピングに対して3つ目のプロファイルを持ちます。 一意のプロファイルごとに2つの構成を作成しますが、共通のプロファイルも各構成に追加します。

AutoMapper 4.2の例:

マップされるクラス:ユーザと車両:

public class User
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class Vehicle
{
    public int FleetNumber { get; set; }
    public string Registration { get; set; }
}

プロフィール:

public class Profile1 : Profile
{
    protected override void Configure()
    {
        base.CreateMap<User, User>();
    }
}

public class Profile2 : Profile
{
    protected override void Configure()
    {
        base.CreateMap<User, User>().ForMember(dest => dest.Age, opt => opt.Ignore());
    }
}

public class CommonProfile : Profile
{
    protected override void Configure()
    {
        base.CreateMap<Vehicle, Vehicle>();
    }
}

次に、設定を作成してオブジェクトをマップします。

[TestMethod]
public void TestMethod()
{
    var user = new User() { Name = "John", Age = 42 };
    var vehicle = new Vehicle {FleetNumber = 36, Registration = "XYZ123"};

    var configuration1 = new MapperConfiguration(cfg =>
    {
        cfg.AddProfile<CommonProfile>();
        cfg.AddProfile<Profile1>();
    });

    var mapper1 = configuration1.CreateMapper();
    var mappedUser1 = mapper1.Map<User, User>(user);//maps both Name and Age
    var mappedVehicle1 = mapper1.Map<Vehicle, Vehicle>(vehicle);//Maps both FleetNumber 
                                                                //and Registration.

    var configuration2 = new MapperConfiguration(cfg =>
    {
        cfg.AddProfile<CommonProfile>();
        cfg.AddProfile<Profile2>();
    });

    var mapper2 = configuration2.CreateMapper();
    var mappedUser2 = mapper2.Map<User, User>(user);//maps only Name
    var mappedVehicle2 = mapper2.Map<Vehicle, Vehicle>(vehicle);//Same as mappedVehicle1.
}

私はこれを試して、それは動作します。

私はWCFサービスでAutoMapperを使用してUserオブジェクトを返します。 UserAccountTeamsなどのプロパティがあり、それ自体に子オブジェクトがあります。 すべてのクラスにはAutoMapperマップがあります。

呼び出されるWCF OperationContract応じて、私は異なる量のデータを返したいと思います。 1つのOperationContract AccountTeamsプロパティ(およびその子)が設定されていないUserオブジェクトを返し、もう1つのOperationContractでプロパティのチェーン全体を記入してUserを返すようにしUser

同じ2つのオブジェクトの間に2つの異なるマップを持つ方法はありますか、完全なマッピングを実行して、サービスから戻ってこないプロパティをnullにする必要がありnullか?


hereで説明here 、さまざまなConfigurationオブジェクトでこの問題を解決できると思いますが、 hereでその例を見つけることができます





automapper