Ninject Overriding Bindings

时间:2013-09-13 14:52:06

标签: c# dependency-injection ninject

从下面引用的教程中,有一个控制器:

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>();
}

...只要HomeController被实例化,就会调用 TextFileLogger()。正确的吗?

教程继续这样说:

  

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

我的问题是:

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

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

1 个答案:

答案 0 :(得分:2)

你误解了。

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

作者意味着,如果你更改绑定(即编辑To<>()部分),它将会神奇地继续使用你在那里实现的任何内容{{1 }}

相关问题