2

我想在中等信任环境中使用依赖注入。为此,我选择了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 框架在中等信任下工作(意味着不使用反射)

4

4 回答 4

2

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

于 2009-04-08T10:19:03.963 回答
2

要以中等信任运行 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)。这些扩展为您处理繁重的工作。

于 2009-04-05T18:26:40.930 回答
1

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

UseReflectionBasedInjection = true;
于 2009-03-28T19:03:42.597 回答
0

好的提示(但你的意思是把它设置为 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;
    }

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

于 2009-03-28T19:13:21.777 回答