我在我的应用程序中使用ASP.NET MVC 3 + Ninject,它与我的控制器配合使用。
我还有一个custom base page class that inherits from WebViewPage,我已经设置了一个我希望在该自定义基页类中注入的接口。
然而,它不起作用(我的接口为空),我认为这是因为Ninject不知道System.Web.Mvc.MvcWebRazorHostFactory,我怀疑它必须以某种方式覆盖或拦截。
有人能指出我如何允许我的自定义WebViewPage使用DI吗?
答案 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;
}
}