【问题标题】:Problems with MVC Controllers + Dependency Injection (Ninject) in medium trust中等信任中 MVC 控制器 + 依赖注入 (Ninject) 的问题
【发布时间】: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 框架在中等信任下工作(意味着不使用反射)

【问题讨论】:

    标签: asp.net-mvc dependency-injection inversion-of-control ninject medium-trust


    【解决方案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;
            }
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-27
          • 2014-05-27
          • 2019-06-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多