asp.net-mvc - MVC3、Ninject、MvcSiteMapProvider - 如何将依赖项注入(inject)到重写方法

标签 asp.net-mvc dependency-injection inversion-of-control ninject service-locator

我有一个正在使用 Ninject 的 MVC3 应用程序和 MvcSiteMapProvider .

我创建了此类,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 本身实例化此类型,因此我不确定如何将我的存储库注入(inject)其中。

我考虑通过获取内核句柄并调用 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 stackoverflow所有答案都说不要使用服务位置。

我该怎么办?

最佳答案

这似乎是《为什么提供商的设计不好?》一书中的另一章。对于任何类型的 ASP.NET 提供程序,您都会遇到同样的问题。对于他们来说,没有真正好的、令人满意的解决方案。只是黑客。

我认为最好的选择是 fork 该项目并更改 DefaultSiteMapProvider 以使用 DepenencyResolver 而不是 Activator 并将实现提供回社区。然后您可以在 PageNodeProvider 实现中使用构造函数注入(inject)。这将为所有类型和所有人一次性解决问题。

当然,您也可以在您的实现中使用 DependencyResolver。但这到目前为止还不是最好的解决方案,因为您应该让实例尽可能接近根,这会使测试变得更加复杂,并且它只为您解决问题。

关于asp.net-mvc - MVC3、Ninject、MvcSiteMapProvider - 如何将依赖项注入(inject)到重写方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7933995/

相关文章:

.net - 共享默认 MVC Controller

javascript - 什么是众所周知的 JavaScript MVC 模式?

c# - 构造函数注入(inject)和被注入(inject)依赖项的初始化

c# - 温莎城堡 : Register generics with more than one items

c# - UnityContainer.Resolve 还是 ServiceLocator.GetInstance?

c# - 控制反转/依赖注入(inject)和转换运算符

c# - 代码首次尝试创建数据库时出现异常

c# - EF : Potential runtime violation of table如何解决

dependency-injection - 适用于 Windows 8 Metro 应用程序的依赖注入(inject)框架

design-patterns - 这是 IOC 的典型用例吗?