中等信任中 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) 的问题的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core MVC 之依赖注入 Controller
ASP.NET MVC IOC依赖注入之Autofac系列开篇
ASP.NET Core Web 应用程序系列- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入(MVC当中应用)