3

IoC コンテナーを調査していますが、NInject の使用時に問題が発生しました。

インターフェイスがあり、Microsoft Unity を使用して、そのインターフェイスのいくつかのマッピング (名前のない 1 つのマッピング、既定のマッピング、およびさらに 2 つの名前付きインスタンス) を定義すると、Unity にインターフェイスを指定せずに解決するように要求すると、登録された既定の型が適切に取得されます。名前。

団結:

myContainer.RegisterType<ILogger, DefaultLogger>();
myContainer.RegisterType<ILogger, FastLogger>("fast");
myContainer.RegisterType<ILogger, DatabaseLogger>("dblogger");

var result = myContainer.Resolve<ILogger>();

ここでresultは、タイプになりますDefaultLogger-私が予想したように(Autofacまた、このように機能します)。

他のコンテナは異なる動作をします - いくつかは非常に奇妙な方法です。NInject は単に例外を引き起こします。

k.Bind<ILogger>().To<DefaultLogger>();
k.Bind<ILogger>().To<FastLogger>().Named("fast");
k.Bind<ILogger>().To<DatabaseLogger>().Named("dblogger");

var result = k.Get<ILogger>();

期待どおりのインスタンスを取得する代わりにDefaultLogger、例外が発生しています。

Ninject.ActivationException は処理されませんでした
Message=ILogger のアクティベーション中にエラーが発生し
ました 複数の一致するバインディングが利用可能です。

はい - 複数のマッピングがあることは知っていますが、特に名前付きマッピングを要求していない場合、名前なしマッピングを取得すると予想していました.....

これを NInject で動作させることはできますか? または、すべてのマッピングに名前を付けて、デフォルトのケースでも名前付きマッピングを要求する必要がありますか?

4

1 に答える 1

0

これは機能します

class Program
{
  static void Main(string[] args)
  {
    var kernel = new StandardKernel();

    kernel.Bind<IOperation>().To<DefaultOperation>()
    .When(c => !c.Parameters.Any());

    kernel.Bind<IOperation>().To<SuccessOperation>()
    .Named("Success");

    kernel.Bind<IOperation>().To<FailureOperation>()
    .Named("Failure");

    var operation = kernel.Get<IOperation>();
    operation.ShowMessage();
    Console.ReadLine();
  }
}

于 2014-12-22T07:44:23.517 に答える