我正在开发ASP.NET MVC 5应用程序。我需要在控制器的构造函数中使用参数。 DefaultControllerFactory无法解析它,我从它继承了我自己的ControllerFactory:
public class ControllerFactoryProvider : DefaultControllerFactory
{
public IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName)
{
string controllerType = string.Empty;
IController controller = null;
// Read Controller Class & Assembly Name from Web.Config
controllerType = ConfigurationManager.AppSettings[controllerName];
if (controllerType == null)
throw new ConfigurationErrorsException("Assembly not configured for controller " + controllerName);
// Create Controller Instance
IDataTransmitter _dataTransmitter = new DataTransmitter();
controller = Activator.CreateInstance(Type.GetType(controllerType), _dataTransmitter) as IController;
return controller;
}
public void ReleaseController(IController controller)
{
//This is a sample implementation
//If pooling is used to write code to return the object to pool
if (controller is IDisposable)
{
(controller as IDisposable).Dispose();
}
controller = null;
}
} 我在Global.asax注册了它:
ControllerBuilder.Current.SetControllerFactory(新 ControllerFactoryProvider());
但是当我运行我的app时,无论使用什么DefaultControllerFactory都没有看到带参数的构造函数。
我在哪里可以出错?
答案 0 :(得分:1)
正如我在评论中所说,没有必要覆盖您的控制器工厂。您只需要插入首选的依赖注入容器。
我没有机会使用.net的每个依赖注入容器,但我会尽力给出客观答案。
在Ninject
项目中设置asp.net Mvc 5
非常简单。
有一个非常方便nuget package
名为Ninject.MVC5
。
您可以安装它:
manage nuget packages
对话框或Install-Package Ninject.MVC5
。 安装Ninject.MVC5
后,您会在App_Start/
中的解决方案中看到一个名为NinjectWebCommon.cs
的新文件。 Here您可以看到该文件的内容最终会成为什么。
现在已安装软件包,您希望使用ninject的api注册您的密码。
假设您有一个IFoo
界面及其实现Foo
public interface IFoo
{
int Bar()
}
public class Foo : IFoo
{
public int Bar()
{
throw new NotImplementedException();
}
}
在NinjectWebCommon
课程中,您将告诉ninject
如何解析IFoo
界面:
/// <summary>
/// Load your modules or register your services here!
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IFoo>().To<Foo>();
}
请记住,默认情况下Ninject有implicit self binding of concrete types,这意味着
如果您要解析的类型是具体类型(如上面的Foo),Ninject将通过称为隐式自绑定的机制自动创建默认关联。这就好像有这样的注册:
Bind<Foo>().To<Foo>();