从下面引用的教程中,有一个控制器:
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/
答案 0 :(得分:2)
你误解了。
Ninject不能(默认情况下)决定在给定两个相同的绑定的情况下使用哪个具体类。但它确实支持上下文绑定。例如,您可以在TextFileLogger
中注入HomeController
,在其他地方注入另一个具体实现......但只有在明确说明此类要求时才会注明。
作者意味着,如果你更改绑定(即编辑To<>()
部分),它将会神奇地继续使用你在那里实现的任何内容{{1 }}