2017-06-25 16 views
0

私はBusinessLayer, DTO library,DataService, EntityModel(wher EDMX sits)を持っていますが、DTOライブラリはビジネス層とデータ層の両方を指します。私はautomapperをデータレイヤーに実装しようとしていますが、エンティティオブジェクトをDTOオブジェクトにマップし、dataServiceライブラリからDTOを返したいとします。WPFアプリケーションでオートマトンを実装する方法と場所

現在

public class DataService 
{ 
    private MapperConfiguration config; 
    public DataService() 
    { 
     IMapper _Mapper = config.CreateMapper(); 
    } 

    public List<Dto.StudentDto> Get() 
    { 
     using(var context = new DbContext().GetContext()) 
     { 
      var studentList = context.Students.ToList(); 
      config = new MapperConfiguration(cfg => { 
       cfg.CreateMap<Db.Student, Dto.StudentDto>(); 
      }); 
      var returnDto = Mapper.Map<List<Db.Student>, List<Dto.StudentDto>>(studentList); 
      return returnDto; 
     } 
    } 
} 

がどのように私はdataseriveへの呼び出しが行われたときに自動的に初期化する必要があるクラスとautomapperへのすべてのマッピングを移動することができますこの方法をやっていますか?

答えて

2

データレイヤーでAutoMapperを使用することをお勧めしますか?

はい。

すべてのマッピングを1つのクラスに移動するにはどうしたらよいですか?オートマトンは、dataseriveの呼び出し時に自動的に初期化する必要がありますか?

あなたは一度だけのマッピングを作成し、静的クラス作成することができます:あなたはあなたのデータサービスでは、このクラスを使用していることを確認してください

public static class MyMapper 
{ 
    private static bool _isInitialized; 
    public static Initialize() 
    { 
     if (!_isInitialized) 
     { 
      Mapper.Initialize(cfg => 
      { 
       cfg.CreateMap<Db.Student, Dto.StudentDto>(); 
      }); 
      _isInitialized = true; 
     } 
    } 
} 

を:

、実際にどのようにDependending
public class DataService 
{ 
    public DataService() 
    { 
     MyMapper.Initialize(); 
    } 

    public List<Dto.StudentDto> GetStudent(int id) 
    { 
     using (var context = new DbContext().GetContext()) 
     { 
      var student = context.Students.FirstOrDefault(x => x.Id == id) 
      var returnDto = Mapper.Map<List<Dto.StudentDto>>(student); 
      return returnDto; 
     } 
    } 
} 

を実行可能ファイルのMain()メソッドか、のコンストラクタ以外の場所からカスタムマッパークラスのInitialize()メソッドを呼び出すことができますクラス。

+0

この静的クラスMyMapperをスタートアッププロジェクトから呼び出す方法私たちはwpf開発のためにプリズムを使用しています。 mapper.Initialize()を各dataserviceクラスから呼び出すとどうなりますか? – PRK

+0

AppDomainごとに一度だけ呼び出す必要があります。 Prismを使用している場合、これを行うにはBootstrapperクラスが適しています。 – mm8

+0

Bootstrapperで初期化したい場合は、このDataServiceプロジェクト参照をUIに追加する必要があります(UIにDataProjectを追加したくありません)、ブートストラップから初期化する方法 – PRK

1

AutoMapper.Mapper.CreateMapOnAppInitializeとしてください。より良いスタイルのために、独自のstaticclassで実装を行うことができます。

マッピングには(CreateMap)1回だけ登録する必要があるため、これ以上の魔法はありません。

dataseriveの呼び出し時に自動的に初期化されますか?

もちろん、コンストラクタに登録することもできます。

Hereあなたは、1つまたは2つの多くの拡張された方法でレジスタを使用する方法を見てみることができます。

最後にAutoMapperは、あなたの人生を楽にし、より難しくするはずです。私の意見では、アプリケーションを起動するときに、すべてを一度に登録するのが最善の方法です。

コンストラクタには、それぞれCreateMapを分けるようにオンデマンドで行うこともできます。

どちらの方法でも、一度呼び出すだけで十分です。

+0

可能であれば、いくつかの例を共有することができますか?データレイヤーでAutoMapperを使用するのは良い方法ですか? – PRK

+0

私は 'ASP.NET'の中でそれを使用し、起動メソッドの一種に登録しました。これは多くの意味があり、WPFと同じように思えるのです。とにかくそれをやりたいからです。 – Peter

+0

例えば、当事者はデータエンティティクラスであり、RegisterMappings()メソッドを呼び出してデータエンティティを解決するには、データサービスライブラリプロジェクト参照をUIプロジェクトに追加する必要がありますか?私はこのクラスを "AutoMapperConfiguration"データレイヤーで作成します。私はUIプロジェクトへのデータサービスの参照を追加できません – PRK

関連する問題