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正确的?

该教程继续说:

如果您要更改它以使用我们的 EventFileLogger 实现,就像前面的示例之一一样,您将看到您所要做的就是创建实现,使其实现 ILogger,然后将其注册到您的内核绑定中。无需更改任何使用它的控制器。

我的问题是:

如果我创建了一个名为EventFileLogger()which 实现的新类ILogger,然后创建了类似的绑定kernel.Bind<ILogger>().To<EventFileLogger>();,Ninject 如何知道在实例化时使用我的新EventFileLogger()绑定而不是其他绑定?TextFileLogger()HomeController

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

4

1 回答 1

2

你误会了。

Ninject 不能(默认情况下)在给定两个相同绑定的情况下决定使用哪个具体类。但是,它确实支持上下文绑定。例如,您可以在其他地方TextFileLogger注入您的和另一个具体的实现......但只有当您明确说明此类要求时。HomeController

作者的意思是,如果您更改绑定(即编辑该To<>()部分),它将神奇地继续使用您放在那里的任何实现ILogger

于 2013-09-13T15:09:24.580 回答