中等信任中 MVC 控制器 + 依赖注入 (Ninject) 的问题

Posted

技术标签:

【中文标题】中等信任中 MVC 控制器 + 依赖注入 (Ninject) 的问题【英文标题】:Problems with MVC Controllers + Dependency Injection (Ninject) in medium trust 【发布时间】:2010-10-16 03:37:59 【问题描述】:

我想在中等信任环境中使用依赖注入。为此,我选择了Ninject,因为有人告诉我它的重量很轻。如何设置注入控制器?

当我尝试创建自定义控制器工厂时:

 public class NinjectControllerFactory : DefaultControllerFactory
    
        private readonly IKernel _kernel;
        public NinjectControllerFactory(params IModule[] modules)
        
            _kernel = new StandardKernel(modules);
        

        public override IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName)
        
            IController controller = base.CreateController(requestContext, controllerName);
            _kernel.Inject(controller);
            return controller;
        
    

但是我遇到了这个错误:

 System.InvalidOperationException was unhandled by user code
  Message="An error occurred while creating a controller of type 'xxx'.

如果控制器没有 控制器工厂,确保它有 一个无参数的公共构造函数。”

知道如何让 Ninject 或任何其他 IoC 框架在中等信任下工作(意味着不使用反射)

【问题讨论】:

【参考方案1】:

要以中等信任度运行 Ninject 1.x,您必须将 UseReflectionBasedInjection 选项设置为 true。 Ninject 2.0 不受此限制。

反射实际上不是中等信任的受保护操作,但轻量级代码生成(Ninject 默认使用它进行注入)是 -- 至少在 .NET 3.5 SP1 之前。

切换到基于反射的注入后,您的代码应该可以按预期工作。我还鼓励您查看 Ninject.Framework.Mvc(用于 Ninject 1.x)或 Ninject.Web.Mvc(用于 Ninject 2.0)。这些扩展为您处理繁重的工作。

【讨论】:

我使用的是ninject 2。Ninject.Web.Mvc 不是中等信任度【参考方案2】:

我最终没有设法解决这个问题,我切换到Unity - 在中等信任下工作,没有任何麻烦。

【讨论】:

【参考方案3】:

在创建容器时尝试设置此选项:

UseReflectionBasedInjection = true;

【讨论】:

【参考方案4】:

很好的提示(但你的意思是把它设置为 false 吗?),我改变了我的构造函数,使它像这样:

public NinjectControllerFactory(params IModule[] modules)
        
            _kernel = new StandardKernel(modules);
            _kernel.Options.UseReflectionBasedInjection = false;
        

这会得到同样的异常。

我也尝试过像这样覆盖 GetControllerInstance

  protected override IController GetControllerInstance(Type controllerType)
    
        return _kernel.Get(controllerType) as IController;
    

但这会引发安全异常,因为它使用反射。

【讨论】:

以上是关于中等信任中 MVC 控制器 + 依赖注入 (Ninject) 的问题的主要内容,如果未能解决你的问题,请参考以下文章

转007.ASP.NET MVC控制器依赖注入

csharp asp.net mvc控制器使用依赖注入

ASP.NET Core MVC 之依赖注入 Controller

ASP.NET MVC IOC依赖注入之Autofac系列开篇

用于依赖注入的 MVC Web API 和 Unity

ASP.NET Core Web 应用程序系列- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入(MVC当中应用)