22

別のサービスを呼び出しているサービスがあります。どちらのサービスも「同じクラス」を使用しています。クラスの名前とプロパティは同じですが、名前空間が異なるため、AutoMapper を使用して一方の型から他方の型にマップする必要があります。

いいえ、私がしなければならないのCreateMap<>CreateMap<>. CreateMapオート機能はありませんか?したがって、CreateMap() と言うと、AutoMapper は組織を介して機能し、すべてのクラスを見つけてCreateMap、これらのクラスとそのサブクラスなどに対して自動的に実行します…</p>

簡単な解決策を期待するか、反射で修正できると思います...

4

5 に答える 5

31

CreateMissingTypeMapsオプションでtrueに設定するだけです:

var dto = Mapper.Map<FooDTO>
     (foo, opts => opts.CreateMissingTypeMaps = true);

頻繁に使用する必要がある場合は、ラムダをデリゲート フィールドに格納します。

static readonly Action<IMappingOperationOptions> _mapperOptions =
    opts => opts.CreateMissingTypeMaps = true;

...

var dto = Mapper.Map<FooDTO>(foo, _mapperOptions);

アップデート:

上記のアプローチは、AutoMapper の最近のバージョンでは機能しなくなりました。

代わりに、CreateMissingTypeMapstrue に設定してマッパー構成を作成し、この構成からマッパー インスタンスを作成する必要があります。

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMissingTypeMaps = true;
    // other configurations
});
var mapper = config.CreateMapper();

古い静的 API (推奨されなくなりました) を使い続けたい場合は、次のようにすることもできます。

Mapper.Initialize(cfg =>
{
    cfg.CreateMissingTypeMaps = true;
    // other configurations
});

更新 2 - Automapper 9 以降:

Automapper バージョン 9.0 以降、CreateMissingTypeMapsAPI は削除されました。Automapper のドキュメントでは、マップを手動で、またはリフレクションを使用して明示的に構成することが提案されています。

https://docs.automapper.org/en/stable/9.0-Upgrade-Guide.html#automapper-no-longer-creates-maps-automatically-createmissingtypemaps-and-conventions

于 2014-05-01T00:10:02.570 に答える
6

CreateMissingTypeMaps は、プロファイル内で設定できます。ただし、サイレント エラーを防ぐために、マッピングごとに明示的に CreateMap を使用し、各プロファイルの単体テストで AssertConfigurationIsValid を呼び出すことをお勧めします。

public class MyProfile : Profile {
    CreateMissingTypeMaps = true;

    // Mappings...
}
于 2016-06-12T14:41:58.237 に答える
4

AutoMapper には、使用できる可能性のある DynamicMap メソッドがあります。これを説明する単体テストの例を次に示します。

[TestClass]
public class AutoMapper_Example
{
    [TestMethod]
    public void AutoMapper_DynamicMap()
    {
        Source source = new Source {Id = 1, Name = "Mr FooBar"};

        Target target = Mapper.DynamicMap<Target>(source);

        Assert.AreEqual(1, target.Id);
        Assert.AreEqual("Mr FooBar", target.Name);
    }

    private class Target
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    private class Source
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}
于 2013-06-13T12:34:17.333 に答える