2016-06-13 4 views
2

要約:InjectionFactoryが型マッピングのために実行されていないようです。私はなぜ、どのように問題を解決するかを知りたい。まずUnity InjectionFactoryが実行されない

、私はこれは、いくつかの工夫の後

The current type, NLog.ILogger, is an interface and cannot be constructed. Are you missing a type mapping? 

の結果、私がすることを決定したインタフェース

Container.RegisterType<ILogger>(new InjectionFactory((c, t, n) => { 
       return LogManager.GetLogger(n); 
      })); 

を登録し、

ServiceLocator.GetInstance<ILogger>("Operation Manager"); 

サービスロケータを使用して解決しようとしました別のアプローチを試して、具体的なタイプを使用してサービスを登録してください

Container.RegisterType<Logger>(new InjectionFactory((c, t, n) => { 
        return LogManager.GetLogger(n); 
       })); 

そしてこれは、次のエラーが発生し

public OperationService([Dependency("Operation Service")]Logger logger) 

に解決方法を変更:

The type Logger does not have an accessible constructor. 

機能はI」場合、私は、この動作のために考えることができる唯一の理由は、 InjectionFactoryを介して渡されたオブジェクトは、実際にオブジェクトを解決するために呼び出されません。

+0

依存関係を名前で解決しようとしています。つまり、「操作マネージャー」です。しかし、登録するときには、この名前を使用しないでください。 –

+0

@JoeBlow私はインスタンスを作成するためのカスタムメソッドを提供することによって、コンテナの "解決"メソッドに与えられた名前に基づいてオブジェクトを解決しようとしています。 LogManager.GetLogger(name)は返されるロガーの名前をとります。私は解決名をGetLoggerメソッドに渡してインスタンスを作成します。 – Benjamin

+0

万が一、Microsoftのユニティについて話していますか?つまり、あなたの質問に使用したタグのUnity3Dゲームエンジンではありませんか? – Bart

答えて

0

名前を付けずにタイプを登録したため、名前で解決しようとしているからです。 Unityは(ILogger, "Operation Manager")の登録を探しますが、見つからない場合があります。名前のない登録は適格候補とはみなされないので、InjectionFactoryは呼び出されません。

私が知る限り、あなたがしようとしていることを達成するための組み込みの方法はありません。カスタムエクステンションでは可能かもしれませんが、これまでの試みは失敗しました。

+0

お試しいただきありがとうございます。それは、一体化に関する有用な文書があれば助けになるでしょう。インジェクションファクトリーは、名前のパラメータを取る関数を必要としますが、実際にそのパラメータを与える方法はないように設定されています。 – Benjamin

関連する問題