40

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

呼び出されるWCF に応じて、OperationContractさまざまな量のデータを返したいと考えています。プロパティ (およびその子) が入力されていないオブジェクトOperationContractを返すものと、プロパティのチェーン全体が入力されたものを返すものがあります。UserAccountTeamsOperationContractUser

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

4

3 に答える 3

21

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

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

例、AutoMapper 4.2:

マッピングされるクラス: User および Vehicle:

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.
}

私はこれを試してみましたが、うまくいきます。

于 2016-06-12T03:04:18.883 に答える
15

Userからにマッピングしていると仮定していますUser(そうでない場合は、宛先タイプを変更するだけです)

次の例では、このクラスを想定しています。

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

次に、separateAutoMapper.Configurationを使用して 2 つのマップを定義できます。

[TestMethod]
public void TestMethod()
{
    var configuration1 = new Configuration(new TypeMapFactory(), MapperRegistry.AllMappers());
    var mapper1 = new MappingEngine(configuration1);
    configuration1.CreateMap<User, User>();

    var user = new User() { Name = "John", Age = 42 };
    var mappedUser1 = mapper1.Map<User, User>(user);//maps both Name and Age

    var configuration2 = new Configuration(new TypeMapFactory(), MapperRegistry.AllMappers());
    configuration2.CreateMap<User, User>().ForMember(dest => dest.Age, opt => opt.Ignore());
    var mapper2 = new MappingEngine(configuration2);

    var mappedUser2 = mapper2.Map<User, User>(user);
    Assert.AreEqual(0, mappedUser2.Age);//maps only Name
}

他のすべての Type を 2 回マッピングすることを回避するには、Configurationwhich から到達できるすべてのものをマップする共通メソッドを追加し、Userこれを の両方configuration1configuration2の呼び出しの後に呼び出すことができますCreateMap

アップデート

Automapper 4.x の場合は、次を使用します。

var configuration1 = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<User, User>();
});

var mapper1 = configuration1.CreateMapper();
var user = new User() { Name = "John", Age = 42 };
var mappedUser1 = mapper1.Map<User, User>(user);//maps both Name and Age

var configuration2 = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<User, User>().ForMember(dest => dest.Age, opt => opt.Ignore());
});

var mapper2 = configuration2.CreateMapper();
var mappedUser2 = mapper2.Map<User, User>(user);   //maps only Name
于 2013-01-10T22:24:03.703 に答える
2

ここで説明されているように、さまざまな構成オブジェクトを使用してこの問題を解決できると思います。 この例はここにあります

于 2013-01-10T20:08:15.680 に答える