使用Ninject和自定义WebViewPage类型

时间:2011-09-28 15:59:24

标签: asp.net-mvc-3 ninject.web.mvc

我在我的应用程序中使用ASP.NET MVC 3 + Ninject,它与我的控制器配合使用。

我还有一个custom base page class that inherits from WebViewPage,我已经设置了一个我希望在该自定义基页类中注入的接口。

然而,它不起作用(我的接口为空),我认为这是因为Ninject不知道System.Web.Mvc.MvcWebRazorHostFactory,我怀疑它必须以某种方式覆盖或拦截。

有人能指出我如何允许我的自定义WebViewPage使用DI吗?

2 个答案:

答案 0 :(得分:2)

好吧,我到目前为止找到的最佳解决方案是使用DependencyResolver从类的构造函数手动注入依赖项:

public class MyView : WebViewPage<MyModel>
{
    IContract _contract;

    public MyView ()
    {
        _contract= DependencyResolver.Current.GetService<IContract>();
    }
}

由于Ninject与DependencyResolver集成,因此到目前为止效果很好。

问候。

答案 1 :(得分:0)

这是一个可能的解决方法...使用KernelPersister来声明内核,并直接从基本View中引用它。它不像构造函数注入那样漂亮和无缝,但它可以解决问题。

KernelPersister可能看起来像这样......

public static class KernelPersister
{
     static IKernel persistedKernel;

     /// <summary>
     /// Persists the provided kernel
     /// </summary>
     public static void Set(IKernel kernel)
     {
          if(persistedKernel == null)
          {
               throw new ArgumentNullException("kernel");
          }

          persistedKernel = kernel;
     }

     /// <summary>
     /// Gets the persisted kernel
     /// </summary>
     public static IKernel Get()
     {
          if(persistedKernel == null)
          {
               throw new Exception("The kernel must be actively set in the persister");
          }
          return persistedKernel;
     }
}

基本视图可能如下所示......

public abstract class MyBaseView : System.Web.Mvc.WebViewPage
{
     /// <summary>
     /// Gets access to the MyService
     /// </summary>
     protected IMyService MyService {get; private set;}

     /// <summary>
     /// ctor the Mighty
     /// </summary>
     public MyBaseView()
     {
          var kernel = KernelPersister.Get();
          this.MyService = kernel.GetService(typeof(IMyService)) as IMyService;          
     }
}