2016-02-05 11 views
11

私はAutoMapper 4.2を使用するプロジェクトを更新しています。私は変更を突破しています。私はが上記の変更を解決するのにと思っていますが、私はこれを最も適切な方法で行っているとは確信していません。AutoMapper 4.2とNinject 3.2

古いコードでは、NinjectConfigurationAutoMapperConfigurationクラスがそれぞれWebActivatorによって読み込まれています。そのように、新しいバージョンではAutoMapperConfigurationは脱落し、バインディングが起こっているNinjectConfigurationクラスの直接私の代わりにインスタンスMapperConfigurationを:だから

private static void RegisterServices(
    IKernel kernel) { 
    var profiles = AssemblyHelper.GetTypesInheriting<Profile>(Assembly.Load("???.Mappings")).Select(Activator.CreateInstance).Cast<Profile>(); 
    var config = new MapperConfiguration(
     c => { 
      foreach (var profile in profiles) { 
       c.AddProfile(profile); 
      } 
     }); 

    kernel.Bind<MapperConfiguration>().ToMethod(
     c => 
      config).InSingletonScope(); 

    kernel.Bind<IMapper>().ToMethod(
     c => 
      config.CreateMapper()).InRequestScope(); 

    RegisterModules(kernel); 
} 

、これはNinjectを使用してAutoMapper 4.2を結合する適切な方法は何ですか?それは今のところ働いているようですが、私は確信しています。

答えて

14

IMapperインターフェイスはライブラリに存在しませんでしたので、以下のインターフェイスとクラスを実装し、それらをシングルトンパターンとしてバインドする必要がありました。

public interface IMapper 
{ 
    T Map<T>(object objectToMap); 
} 

public class AutoMapperAdapter : IMapper 
{ 
    public T Map<T>(object objectToMap) 
    { 
     //Mapper.Map is a static method of the library! 
     return Mapper.Map<T>(objectToMap); 
    } 
} 

今、あなたは、単にmapperConfiguration.CreateMapper(の単一のインスタンスにライブラリのIMapperインターフェイスをバインド)

あなたのコードカントーを通報します、あなたは、単一のインスタンスを使用する必要があります(またはNinjectが言うように、一定の)バインド。

// A reminder 
var config = new MapperConfiguration(
    c => { 
     foreach (var profile in profiles) { 
      c.AddProfile(profile); 
     } 
    }); 
// Solution starts here 
var mapper = config.CreateMapper(); 
kernel.Bind<IMapper>().ToConstant(mapper); 
+0

InRequestScope()ではなく、InSingletonScope()が必要ですか?さもなければバインディングはOKですか? – Gup3rSuR4c

+0

@Alex申し訳ありませんコードサンプルを忘れました。 –

+0

これは私の問題を解決しました。 –