【发布时间】:2011-12-17 13:16:22
【问题描述】:
我有一个使用 Ninject 和 MvcSiteMapProvider 的 MVC3 应用程序。
我创建了这个类,MvcSiteMapProvider 用它来动态地将节点添加到我的站点地图:
public class PageNodeProvider : DynamicNodeProviderBase
{
public override IEnumerable<DynamicNode> GetDynamicNodeCollection()
{
// need to get repository instance
var repository = // how do I get this???
foreach (var item in repository.GetItems())
{
yield return MakeDynamicNode(item);
}
}
}
MvcSiteMapProvider 自己实例化了这个类型,所以我不知道如何将我的存储库注入它。
我考虑通过获取内核句柄并在方法中调用Get<Repository>() 来使用服务位置。但是,我在查看 NinjectHttpApplication 的定义时看到了这个属性:
// Summary:
// Gets the kernel.
[Obsolete("Do not use Ninject as Service Locator")]
public IKernel Kernel { get; }
Do not use Ninject as Service Locator ?!我该怎么做?
然后我找到了this question here on *,所有答案都说不要使用服务位置。
我该怎么办?
【问题讨论】:
-
MvcSiteMapProvider 在 v4 中放弃了 Microsoft 提供程序模型。它现在完全通过使用 DI 和组合根模式连接起来。根本没有使用依赖解析器。是的,使用依赖解析器是一种不好的做法。
标签: asp.net-mvc dependency-injection inversion-of-control ninject service-locator