web-dev-qa-db-ja.com

AutoMapper 5.2の構成方法

AutoMapperをグローバルに使用するように構成する正しい方法は何ですか。

一度設定してから、アプリを使用したいです。

これは間違っていると強く感じています。実際、これは新しいインスタンスを呼び出すため、これが間違っていることを知っています。グローバル設定が欲しいのですが、それをどのように呼び出すのですか?良い例を見つけることができません!

これはiveが得たものです:しかしそれはimが望んでいるものではありません

public static class AutoMapperConfig
{
      public static IMapper GetMapper()
      {
          var config = new MapperConfiguration(cfg => {
              cfg.CreateMap<R_Logo, LogoDto>();
              //lots more maps...?
          });

          IMapper mapper = config.CreateMapper();
          return mapper;
      }
}

そして使用法:

  var imapper = AutoMapperConfig.GetMapper();
  var dest = imapper.Map<R_Logo, LogoDto>(logo);

に基づく更新:pinkfloydx33

これを一度呼び出すと、設定が完了します。

public static class AutoMapperConfig
{
   public static void RegisterMappings()
   {
        AutoMapper.Mapper.Initialize(cfg => {
           cfg.CreateMap<R_Logo, LogoDto>();
            /* etc */
        });
    }
}
12
Seabizkit

here のように、静的マッパーAPIを使用できます。

たとえば、アプリケーションのどこかで、おそらく起動時に次のようなものを使用して静的(グローバル)マッパーを構成します。

_AutoMapper.Mapper.Initialize(cfg => { 
   cfg.CreateMap<Type1, Type2>(); 
   /* etc */
});
_

次に、「グローバル」に構成されたマッパーを使用する必要があるときはいつでも、静的なMapperプロパティ(IMapper)を介してアクセスします。

_Type1 objectOfType1 = new Type1();
var result = AutoMapper.Mapper.Map<Type2>(objectOfType1);
_

その後、個々のマッパーインスタンスを構成する必要なく、アプリケーションの期間中に提供するすべてのタイプ/構成/プロファイルに対して構成された1つのマッパーがあります。

つまり、一度設定するだけです(おそらくアプリケーションの起動時に)。静的マッパーインスタンス(IMapper)は、_AutoMapper.Mapper_を介してアクセスすることにより、アプリケーション全体のどこからでも使用できます。

この静的プロパティを介したアクセスは、コメントで「グローバルに」参照するものです。必要な場所であれば、Initializeを最初に一度呼び出した限り、AutoMapper.Mapper.Map(...)を使用するだけです。

静的インスタンスでInitializeを複数回呼び出すと、後続の各呼び出しで既存の構成が上書きされることに注意してください。

[〜#〜] warning [〜#〜]AutoMapperの以前のリリースでは、静的マッパーが削除されました。それは後で追加され、将来のバージョンに残ることを保証するかどうかわかりません。推奨事項は、マッパーの独自に構成されたインスタンスを使用することです。必要に応じて、静的プロパティに保存できます。それ以外の場合は、プロファイルなどを調べて、マッパーを簡単に構成して、独自のインスタンスを持つことが必ずしも「面倒」ではないようにすることができます。

6
pinkfloydx33

Asp.netコアmvc​​でオートマッパーを構成する手順は次のとおりです。

1。Profileから拡張するマッピングプロファイルクラスを作成します

 public class ClientMappingProfile : Profile
 {
     public ClientMappingProfile ()
     {
         CreateMap<R_Logo, LogoDto>().ReverseMap();
     }
 }

2。 AutoMapper設定クラスを作成し、マッピングプロファイルクラスをここに追加します。

public class AutoMapperConfiguration
{
   public MapperConfiguration Configure()
   {
        var config = new MapperConfiguration(cfg =>
        {
            cfg.AddProfile<ClientMappingProfile>();
        });
        return config;
    }
}

使用方法。

       var config = new AutoMapperConfiguration().Configure();
       var iMapper = config.CreateMapper();

       var dest = iMapper.Map<R_Logo, LogoDto>(logo);
14
Ahmar

これをStartupConfigまたはStartUpファイルで設定します。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
       // Web API configuration and services    
        .....

        MappingDTOModelToModel.Configure();
    }
}

マッピングの構成、

public static class MappingDTOModelToModel
{       
     private static void Configure()
     {
         Mapper.Initialize(cfg =>
         {
             cfg.CreateMap<R_Logo, LogoDto>()
                 .ForMember(x => x.ID,
                            m => m.MapFrom(a => a.ID))
                 .ForMember(x => x.FirstName,
                            m => m.MapFrom(a => a.FirstName)).ReverseMap();                    
         }
     }
 }

メソッドで呼び出し、

public class MyService
{
    public void MyMethod(var model)
    {
        var myModel = Mapper.Map<LogoDto, R_Logo>(model);  
    }
}

お役に立てれば、

10
Vivek Singh

この問題の解決策は、クラスを「マッピング可能」(To、From、またはBoth)として装飾できる属性の選択を最初に作成することでした。その後、通常はアプリケーションの初期化後にAutoMapperを単一の場所で初期化し、Reflectionを使用して、装飾されたクラスの各インスタンスのマップを動的に作成できます。

以下に例を示します。

var types = _myTypeFinder.Find(type =>
    type.IsDefined(typeof(AutoMapperAttribute)) ||
    type.IsDefined(typeof(AutoMapperFromAttribute)) ||
    type.IsDefined(typeof(AutoMapperToAttribute))
    );

Mapper.Initialize(cfg =>
{
    foreach (var type in types)
    {
        AutoMapperHelper.CreateMap(type, cfg);
    }
});
1
Kallum Tanton