我有一个正在使用的 MVC3 应用程序Ninject http://ninject.org/ and Mvc站点地图提供者 http://mvcsitemap.codeplex.com.
我创建了此类,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
?!我还应该怎么做呢?
然后我发现这个问题在 stackoverflow 上 https://stackoverflow.com/questions/6047603/ninject-mvc3-bootstrappers-kernel-property-is-marked-as-obsolete-how-can-i-get所有答案都说不要使用服务位置。
我应该做些什么?
这似乎是《为什么提供商的设计不好?》一书中的另一章。对于任何类型的 ASP.NET 提供程序,您都会遇到同样的问题。对于他们来说,没有真正好的、令人满意的解决方案。只是黑客。
我认为最好的选择是分叉该项目并更改 DefaultSiteMapProvider 以使用 DepenencyResolver 而不是 Activator 并将实现提供回社区。然后您可以在 PageNodeProvider 实现中使用构造函数注入。这将为所有类型和所有人一次性解决问题。
当然,您也可以在实现中使用 DependencyResolver。但这到目前为止还不是最好的解决方案,因为您应该让实例尽可能接近根,这会使测试变得更加复杂,并且它只为您解决问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)