2

以下で参照されているチュートリアルには、コントローラーがあります。

public class HomeController : Controller
{
  MvcNinjectExample.Logging.ILogger _logger;

  public HomeController(MvcNinjectExample.Logging.ILogger logger)
  {
    _logger = logger;
  }

  public ActionResult Index()
  {
    _logger.LogMessage("Running index page!");

    return Content("Message logged");
  }
}

次のバインディングに従って...

public static void RegisterServices(IKernel kernel)
{
  kernel.Bind<ILogger>().To<TextFileLogger>();
}

...がインスタンス化されるたびにTextFileLogger()HomeControllerが呼び出されます。正しい?

チュートリアルでは、次のように述べています。

これを変更して、前の例の 1 つのように EventFileLogger 実装を使用する場合は、実装を作成し、ILogger を実装させ、カーネル バインディングに登録するだけで済みます。それを使用するコントローラへの変更は必要ありません。

私の質問は:

という名前の新しいクラスを作成し、EventFileLogger()それILoggerから のようなバインディングを作成した場合、Ninjectは がインスタンス化されたときに他のバインディングではなくkernel.Bind<ILogger>().To<EventFileLogger>();新しいバインディングを使用することをどのように認識しますか?EventFileLogger()TextFileLogger()HomeController

参考文献 http://stevescodingblog.co.uk/dependency-injection-beginners-guide/

4

1 に答える 1

2

あなたは誤解しています。

Ninject は、(デフォルトでは) 2 つの同一のバインディングが与えられた場合に、どの具象クラスを使用するかを決定できません。ただし、コンテキスト バインディングはサポートしています。たとえば、別の具体的な実装を別の場所にTextFileLogger注入できます...ただし、そのような要件を明示的に述べた場合のみです。HomeController

作成者は、バインディングを変更する (つまり、To<>()パーツを編集する) と、implements をそこに置いたものは何でも魔法のように引き続き動作することを意味しますILogger

于 2013-09-13T15:09:24.580 に答える