ASP.NET Mvc通用控制器和Ninject注入InRequestScope同时进行

时间:2017-06-22 13:41:23

标签: c# asp.net-mvc asp.net-mvc-4 ninject

不久前,我构建了一个ControllerFactory,其目标是在我的Asp.Net MVC项目中使用Generic Controllers。这个工厂是这样的:

public class MyControllerFactory : DefaultControllerFactory
{
    public override IController CreateController(RequestContext requestContext, string controllerName)
    {
        if (/*controller is generic, I know it by a convention in the controllerName*/)
        {
            string typeName = //resolve Type name from controllerName and requestContext;
            Type controllerType = typeof(MyGenericController<>).MakeGenericType(Type.GetType(typeName));

            var ninjecKernel = //get a ninject kernel;
            return (IController)ninjecKernel.Get(controllerType);
        }
        else 
        {
            //build a normal controller
        }
    }
}

我在Globar.asax文件中使用此控制器工厂,如ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());

但是在ninject注入控制器的服务中是InSingletonScope。现在我决定注入那些服务InRequestScope,因此,服务可以共享相同的EntityFramework上下文。要归档这个,我正在尝试使用this方法,当使用Ninject.Web.Mvc.dll在请求范围中注入服务时。在这种方法中,ninject是通过从NinjectHttpApplication继承Global.asax的MvcApplication而在内部构建控制器的人,因此我不知道如何保留通用控制器代码。

我怎样才能达到这两个目标?

1 个答案:

答案 0 :(得分:0)

不要从NinjectHttpApplication继承你的Global.asax。您仍然可以使用InRequestScope来控制生命周期。