1. ホーム
  2. asp.net-mvc

[解決済み】AutoMapper.CreateMapsをどこに配置するか?

2022-04-18 05:01:10

質問

私は AutoMapper の中に ASP.NET MVC のアプリケーションで使用することができます。を移動させた方がいいと言われました。 AutoMapper.CreateMap はオーバーヘッドが大きいので、他の場所に移動してください。これらの呼び出しを1か所にまとめるために、どのようにアプリケーションを設計すればよいのか、あまりよくわかりません。

私はウェブ層、サービス層、データ層を持っています。それぞれが独立したプロジェクトです。私は Ninject ですべてをDIします。私が活用するのは AutoMapper をWebとサービスの両方の層で使用します。

の設定はどうなっていますか? AutoMapper のCreateMapは?どこに置きますか?どのように呼び出すのですか?

解決方法は?

静的なクラスであれば問題ありません。重要なのは 規約 .

私たちの コンベンション は、各レイヤー(ウェブ、サービス、データ)ごとに AutoMapperXConfiguration.cs というメソッドを持っています。 Configure() で、ここで X はレイヤーです。

は、その Configure() メソッドは、次に private メソッドを各エリアごとに用意しました。

以下は、Web Tierの設定例です。

public static class AutoMapperWebConfiguration
{
   public static void Configure()
   {
      ConfigureUserMapping();
      ConfigurePostMapping();
   }

   private static void ConfigureUserMapping()
   {
      Mapper.CreateMap<User,UserViewModel>();
   } 

   // ... etc
}

各集約(User, Post)ごとにメソッドを作成することで、きれいに分離することができます。

そして、あなたの Global.asax :

AutoMapperWebConfiguration.Configure();
AutoMapperServicesConfiguration.Configure();
AutoMapperDomainConfiguration.Configure();
// etc

これは言葉のインターフェイスのようなもので、強制することはできませんが、それを期待することで、必要に応じてコーディング(とリファクタリング)ができます。

EDITです。

私は今、AutoMapperを使用しています。 プロフィル ということで、上の例はこうなります。

public static class AutoMapperWebConfiguration
{
   public static void Configure()
   {
      Mapper.Initialize(cfg =>
      {
        cfg.AddProfile(new UserProfile());
        cfg.AddProfile(new PostProfile());
      });
   }
}

public class UserProfile : Profile
{
    protected override void Configure()
    {
         Mapper.CreateMap<User,UserViewModel>();
    }
}

よりすっきり/より堅牢になりました。