2017-02-22 6 views
0

私はユニティ・コンテナの中に私のAutoMapper(バージョン5.2.0)プロファイルクラスを登録しようとしている(Unityのバージョン4.0.1)、そしてそれは私に例外を与えています 例外が発生しました:解決中:例外:InvalidOperationException - 現在の型AutoMapper.IConfigurationProviderは、インターフェイスであり、この型はIConsumer`1 [Commands.INewUserEmailCommand]、名前= "(なし)"です。タイプマッピングがありません。AutoMapperユニティAutoMapper.IConfigurationProvider号

ここにプロファイルクラスがあります:

public class AutoMapperBootstrap : Profile 
    { 
     public AutoMapperBootstrap() 
     { 
      this.CreateMap<IUserEmailDTO, MergeUserEmailRequest>(); 
     } 
    } 

そしてここユニティ登録抜粋です:

Profile typeMaps = new AutoMapperBootstrap(); 
var config = new MapperConfiguration(cfg => cfg.AddProfile(typeMaps)); 
container.RegisterInstance<IMapper>(config.CreateMapper(), new ContainerControlledLifetimeManager()); 

それから私は、どうやらUnityはについて何も知らないか、それはいくつかの余分なIConfigurationProviderインスタンスを必要とする注入されるIMapperインスタンスに依存コンストラクタを持っていますか?私は何が欠けていますか?私のコードがIMapperに依存するサービスを呼び出す必要があるとき、Unityは上記の例外をスローします。次に、コンストラクタインジェクションを使用してIMapperインスタンスを取得しようとしているサービスの例を示します。

public class FooService : IFooService 
{ 
    private readonly IMapper mapper; 

    public Foo(IMapper mapper) 
    { 
    this.mapper = mapper; 
    } 
} 
+0

コンテナ登録をスキップして、すべてのマッピングを持つ静的インスタンスを使用するだけですか?静的なコンストラクタを使用して、常に利用可能になるように私のプロファイルを初期化することを考えています... – Andy

答えて

0

@Andyは、私は通常automapperはあなたにそれが失敗しているの詳細を与え、あなたの手掛かりを与えることができ、あなたは自分のマッピングのエラーの一部をコピーすると思います。あなたの下の行で

はIMapperクラス

container.RegisterInstance<IMapper>(config.CreateMapper(), new ContainerControlledLifetimeManager()); 

のインスタンスを登録しようとしているあなたはCreateMapperあなたはそれがIConfigurationProviderを使用していることがわかりますどのように機能するかを、実際に見てみる場合は、automapper原稿をチェックします

public class MapperConfiguration : IConfigurationProvider 
{ 
    ..... 

    public IMapper CreateMapper() 
    { 
     return (IMapper) new Mapper((IConfigurationProvider) this); 
    } 

    ..... 
} 

automapperがMapperのインスタンスを作成しようとしている以下のコードは、同様のパラメータIConfigurationProviderを解決しようとしています。この場合、あなたは決してそのパラメータを注入しませんでした。解像度:そのパラメータのインスタンスを注入し、それは私があなたのために、私はそれを

containerIUnityContainer

のインスタンスである、あなたのユニティに登録
class Helper 
{ 
    public static MapperConfiguration InitializeAutoMapper() 
    { 
     MapperConfiguration config = new MapperConfiguration(cfg => 
     { 
      cfg.AddProfile(new ProfileA()); 
      cfg.AddProfile(new ProfileB()); 
     }); 

     return config; 
    } 
} 

を使用しています方法の例が保存されます。ここ全て

です

var mapperConfig = Helper.InitializeAutoMapper(); 
var mapper = mapperConfig.CreateMapper(); 
container.RegisterType<IMapper, Mapper>(new InjectionConstructor(mapperConfig)); 
container.RegisterInstance(mapper, Activator.CreateInstance<T>());