2011-07-14 24 views
4

私はMVC 3プロジェクトでAutoMapperを使用し始めました。私はMapManagerを作成しました。これは単純にSetupMapsというメソッドを持っていて、最初のマップ設定を作成するためにglobal.asaxで呼びます。私はまた、私のマッピングの1つにValueResolverを使用する必要があります。私にとっては、この特定のValueResolverはいくつかの異なる場所で必要とされ、単にArticle.GenerateSlugから値を返します。MVC 3:AutoMapperとProject/Solution Structure

は、だから私の質問は以下のとおりです。

  1. はどのようにあなたのマップ(Mapper.CreateMap)の全ての初期作成を管理していますか?
  2. ValueResolverのクラスをプロジェクトのどこに配置しますか?モデルフォルダの下にサブフォルダを作成するか、それとも完全に別のものを作成しますか?

ありがとうございました。

答えて

3

私は本当に個人的な好みとして質問2を話すことはありませんが、私は一般的に1つまたは複数のAutoMapper.Profileを使用して、特定の目的(domaintoviewmodelなど)のために私のMapper.CreateMapをすべて保持します。

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

    protected override void Configure() 
    { 
     CreateMap<TripRegistrationViewModel, TripRegistration>() 
      .ForMember(x=>x.PingAttempts, y => y.Ignore()) 
      .ForMember(x=>x.PingResponses, y => y.Ignore()); 
    } 
} 

その後、私は私のプロファイルのすべてを追加し、マッパーを設定するブートストラップ(IInitializer)を作成します。

public class AutoMapperInitializer : IInitializer 
{ 
    public void Execute() 
    { 
     Mapper.Initialize(x => 
          { 
           x.AddProfile<DomainToViewModelAutomapperProfile>(); 
           x.AddProfile<ViewModelToDomainAutomapperProfile>(); 
          }); 
    } 
} 

はその後、私のGlobal.asaxに私は彼らがExecute()を実行してIInitializer、ループのすべてのインスタンスを取得します。

foreach (var initializer in ObjectFactory.GetAllInstances<IInitializer>()) 
      { 
       initializer.Execute(); 
      } 

これは私の一般的な戦略です。


ここでは、最終ステップの反映の実装があります。

var iInitializer = typeof(IInitializer); 

List<IInitializer> initializers = AppDomain.CurrentDomain.GetAssemblies() 
    .SelectMany(s => s.GetTypes()) 
    .Where(p => iInitializer.IsAssignableFrom(p) && p.IsClass) 
    .Select(x => (IInitializer) Activator.CreateInstance(x)).ToList(); 

foreach (var initializer in initializers) 
{ 
    initializer.Execute(); 
} 
+0

私はこれが好きです。私は1つの質問を持っています。 'ObjectFactory.GetAllInstances'が何であるか分かりません。グーグルでは、それはStructureMapの一部であるようです。私はそれを使用したことがないので、.NET BCLの 'ObjectFactory.GetAllInstances'に相当するものがありますか?答えをありがとう。 :) –

+1

iocコンテナを使用していない場合は、開始してください。構造マップは私が主に使うものですが、他にもあります。私は物事を行うネット反射の方法で私の答えを更新しました。その非常に単純な。 –

+0

ありがとう、ネイサン! –