Использование Ninject с пользовательским типом WebViewPage - PullRequest
2 голосов
/ 28 сентября 2011

Я использую ASP.NET MVC 3 + Ninject в своем приложении, которое прекрасно работает с моими контроллерами.

У меня также есть пользовательский базовый класс страниц, который наследуется от WebViewPage , и я настроил интерфейс, который я хотел бы внедрить в этот пользовательский базовый класс страниц.

Однако, это не работает (мои интерфейсы нулевые), и я предполагаю, что это потому, что Ninject не знает о System.Web.Mvc.MvcWebRazorHostFactory, который, как я подозреваю, придется каким-то образом переопределить или перехватить.

Может ли кто-нибудь указать мне правильное направление, как разрешить моему пользовательскому WebViewPage использовать DI?

Ответы [ 2 ]

2 голосов
/ 30 апреля 2012

Что ж, лучшее решение, которое я нашел до сих пор, это ввести зависимость вручную из конструктора класса, используя DependencyResolver:

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

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

Поскольку Ninject интегрируется с DependencyResolver, он пока работает хорошо.

С уважением.

0 голосов
/ 21 января 2012

Вот возможный обходной путь ... Используйте KernelPersister для определения состояния ядра и ссылки на него непосредственно из вашего базового представления. Это не так красиво и незаметно, как инъекция в конструктор, но это помогает.

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;          
     }
}
...