web-dev-qa-db-ja.com

クラスライブラリプロジェクトで自動マッパーを構成する方法

初めて自動マッピングを使用しています。

私はc#アプリケーションで作業しており、自動マッパーを使用したいと思っています。

(私はそれの使い方を知りたいだけなので、asp.netアプリもMVCアプリも持っていません。)

3つのクラスライブラリプロジェクトがあります。

enter image description here

サービスプロジェクトに転送プロセスを記述したい。

自動マッパーをどこでどのように構成する必要があるのか​​知りたいのですが?

32
bnil

構成はどこにでも配置できます。

public class AutoMapperConfiguration
{
    public static void Configure()
    {
        Mapper.Initialize(x =>
            {
                x.AddProfile<MyMappings>();              
            });
    }
}

 public class MyMappings : Profile
{
    public override string ProfileName
    {
        get { return "MyMappings"; }
    }

    protected override void Configure()
    {
    ......
    }

しかし、ある時点でライブラリを使用するアプリケーションによって呼び出される必要があります。

void Application_Start()
    {               
        AutoMapperConfiguration.Configure();
    }
26
severin

したがって、ここでのブルーノの答えと シングルトンに関するジョンスキートの投稿 に基づいて、これを1回だけ実行し、クラスライブラリで完全に分離するために次の解決策を考え出しました。親プロジェクトでマッピングを構成するためのライブラリ:

public static class Mapping
{
    private static readonly Lazy<IMapper> Lazy = new Lazy<IMapper>(() =>
    {
        var config = new MapperConfiguration(cfg => {
            // This line ensures that internal properties are also mapped over.
            cfg.ShouldMapProperty = p => p.GetMethod.IsPublic || p.GetMethod.IsAssembly;
            cfg.AddProfile<MappingProfile>();
        });
        var mapper = config.CreateMapper();
        return mapper;
    });

    public static IMapper Mapper => Lazy.Value;
}

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        CreateMap<Source, Destination>();
        // Additional mappings here...
    }
}

次に、あるオブジェクトを別のオブジェクトにマップする必要があるコードで、次のように実行できます。

var destination = Mapping.Mapper.Map<Destination>(yourSourceInstance);

注:このコードはAutoMapper 6.2に基づいており、古いバージョンのAutoMapperを調整する必要がある場合があります。

21
Marko

ライブラリ外の誰もAutoMapperを設定する必要はありません

IMapper を使用したインスタンスベースのアプローチを使用することをお勧めします。そうすれば、ライブラリの外部にいる人が設定メソッドを呼び出す必要がなくなります。 MapperConfigurationを定義して、そこからすべてクラスライブラリ内にマッパーを作成できます。

var config = new MapperConfiguration(cfg => {
    cfg.AddProfile<AppProfile>();
    cfg.CreateMap<Source, Dest>();
});

IMapper mapper = config.CreateMapper();
// or
IMapper mapper = new Mapper(config);
var dest = mapper.Map<Source, Dest>(new Source());
5
Bruno Zell

マルコの答えは正しいです。

以下の簡単な解決策で行くこともできます。

 public static class ObjectMapper
{
    public static IMapper Mapper
    {
        get
        {
            return AutoMapper.Mapper.Instance;
        }
    }
    static ObjectMapper()
    {
        CreateMap();
    }
    private static void CreateMap()
    {
        AutoMapper.Mapper.Initialize(cfg =>
        {
            cfg.CreateMap<SourceClass, DestinationClass>();
        });
    }
}
public class SourceClass
{
    public string Name { get; set; }
}
public class DestinationClass
{
    public string Name { get; set; }
}
SourceClass c1 = new SourceClass() { Name = "Mr.Ram" };

DestinationClass c2 = ObjectMapper.Mapper.Map<DestinationClass>(c1);
1
Patel Vishal