2

这是一个 MVC 应用程序,其中控制器在构造函数中需要 aDataContextCreator和 a CustomerID。我的ControllerFactory样子:

public class NinjectControllerFactory : DefaultControllerFactory
    {
        private IKernel ninjectKernel;

        public NinjectControllerFactory()
        {
            ninjectKernel = new StandardKernel();
            AddBindings();
        }


        protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
        {
            if (controllerType == null)
            {
                return null;
            }
            else
            {
                string customerID =  requestContext.HttpContext.Session["CustomerID"].ToString();
                return (IController)ninjectKernel.Get(controllerType, new IParameter[]{new Parameter("CustomerID", customerID, true)});
            }
        }

        private void AddBindings()
        {
            ninjectKernel.Bind<IDataContextCreator>().To<DefaultDataContextCreator>();
        }
    }

导航到页面时出现以下错误,即触发控制器的创建:

 Ninject.ActivationException: Error activating int
No matching bindings are available, and the type is not self-bindable.
Activation path:
 2) Injection of dependency int into parameter CustomerID of constructor of type MyController
 1) Request for MyController

以上所有内容都是在 Win 7 上使用 MVC3 .Net 4。感谢您的帮助。

4

1 回答 1

6

为什么要编写自定义控制器工厂?Ninject.MVC3这在使用NuGet 包时并不常见。一种更常见的技术是使用安装此 NuGet 时自动为您注册的自定义依赖项提供程序。

所以这里是步骤:

  1. 摆脱您的自定义控制器工厂
  2. 安装Ninject.MVC3NuGet 包。
  3. ~/App_Start/NinjectWebCommon.cs文件中配置你的内核

    private static void RegisterServices(IKernel kernel)
    {
        kernel
            .Bind<IDataContextCreator>()
            .To<DefaultDataContextCreator>();
        kernel
            .Bind<MyController>()
            .ToSelf()
            .WithConstructorArgument("customerID", ctx => HttpContext.Current.Session["CustomerID"]);
    }        
    
于 2012-10-15T21:11:35.687 回答