2012-04-19 11 views
4

現在AutoMapper(最新の.NET 3.5バージョン)を試しています。 AutoMapperを機能させるには、あるオブジェクトから別のオブジェクトへのマッピング方法に関する設定の詳細を入力する必要があります。(GAC)クラスライブラリからAutomapperを初期化する

Mapper.CreateMap<ContactDTO, Contact>(); 
Mapper.CreateMap<Contact, ContactDTO>(); 

アプリケーション、サービス、ウェブサイトの起動時にこれを行う必要があります。 (global.asaxなどを使用して)

問題は、GACのDLLにAutomapperを使用して、LINQ2SQLオブジェクトをBOの対応するものにマップしています。 .CreateMap <>詳細を指定する必要がなくなるために、マップ2のオブジェクトが必要な場合はいつでもこの設定を指定できます可能であれば、

+2

'Mapper'も静的であるため、GACファイルで' Initialize'メソッドを使って静的クラスを使用してみませんか?アプリの起動時に一度呼び出すだけです。 –

+0

問題は、多くの異なるプロジェクトで使用されているデータアクセスDLLでこれを使用しているため、マッパー初期化の実際のエントリポイントがないことです。 – stvn

+1

C++とは異なり、静的コンストラクタは、アセンブリがロードされていないときにオンデマンドで実行されます。ライブラリへのエントリポイントがある場合は、初期化するためにその型の静的コンストラクタを作成します。それ以外の場合は、[このようなハック](http://einaregilsson.com/module-initializers-in-csharp/) –

答えて

0

解決策はAutoMapper自体にあると思います。

AutoMapperプロファイルを使用して、起動時に登録します。

あなたのプロファイルに依存性が必要ない場合は、IOCコンテナは必要ありません。

/// <summary> 
///  Helper class for scanning assemblies and automatically adding AutoMapper.Profile 
///  implementations to the AutoMapper Configuration. 
/// </summary> 
public static class AutoProfiler 
{ 
    public static void RegisterReferencedProfiles() 
    { 
     AppDomain.CurrentDomain 
      .GetReferencedTypes() 
      .Where(type => type != typeof(Profile) 
       && typeof(Profile).IsAssignableFrom(type) 
       && !type.IsAbstract) 
      .ForEach(type => Mapper.Configuration.AddProfile(
       (Profile)Activator.CreateInstance(type))); 
    } 
} 

そして、彼らだけでちょうどこの例のようにプロファイルを実装:

public class ContactMappingProfile : Profile 
{ 
    protected override void Configure() 
    { 
     this.CreateMap<Contact, ContactDTO>(); 
     this.CreateMap<ContactDTO, Contact>(); 
    } 
} 

しかし、あなたのプロファイルを解決する必要がある依存関係を持っている場合は、AutoMapperのための抽象化を作成し、ちょうど登録する前に、すべてのプロファイルを登録することができ抽象化 - IObjectMapper - このようなシングルトンのように:

public class AutoMapperModule : Module 
{ 
    protected override void Load(ContainerBuilder builder) 
    { 
     base.Load(builder); 

     // register all profiles in container 
     AppDomain.CurrentDomain 
      .GetReferencedTypes() 
      .Where(type => type != typeof(Profile) 
       && typeof(Profile).IsAssignableFrom(type) 
       && !type.IsAbstract) 
      .ForEach(type => builder 
       .RegisterType(type) 
       .As<Profile>() 
       .PropertiesAutowired()); 

     // register mapper 
     builder 
      .Register(
       context => 
       { 
        // register all profiles in AutoMapper 
        context 
         .Resolve<IEnumerable<Profile>>() 
         .ForEach(Mapper.Configuration.AddProfile); 
        // register object mapper implementation 
        return new AutoMapperObjectMapper(); 
       }) 
      .As<IObjectMapper>() 
      .SingleInstance() 
      .AutoActivate(); 
    } 
} 

、ドメイン内のI抽象すべての私の技術は、これが最良のapproacに見えたので、私のためにh。

ここでコードを作成してみましょう。

PS-コードはいくつかのヘルパーと拡張機能を使用している可能性がありますが、そこにはコアのものがあります。

関連する問題