我知道我写的控制器没有无参构造函数,但是我需要一个有参的构造器,所以只能自定义ControllerFactory类,这其中如何把我的控制器注入到IoC容器中呢?
//我的控制器代码:
public class ShopingCartController : Controller
{
protected ICalculator calculator;
public ShopingCartController(ICalculator _calculator)
{
calculator = _calculator;
}
public ActionResult Index()
{....
//我的控制器工厂:
namespace DI.Code
{
public class MyControllerFactory:DefaultControllerFactory
{
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
return controllerType == null
? base.GetControllerInstance(requestContext, controllerType)
: IoC.Resolve<IController>(controllerType);
}
}
internal class IoC
{
internal static T Resolve<T>(Type controllerType)
{
//这里把控制器注入到IoC容器不会写
}
}
}
//另外控制器工厂注册到Global我也写了:
ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());
已解决,哈哈哈哈
加上无参数的构造函数就好了:
public ShopingCartController() { }
第一:这样写还会报错,因为我后面的程序中需要这个构造传入的参数,而加入了无参构造器,那个有参构造器就不工作了(参数没有传入),导致报错:未将对象引用设置到对象的实例。
第二:如果我的无参构造器如果继承了有参构造器,这样就可以正常运行!但是我的目的没达到,绕了一大圈又回来了,因为我本不想这两个类有任何依赖关系的,还不如用原来写法。。。。
.net没用过,但是在JAVA中,Spring的IOC依赖注入的三种方式中的构造器注入可以实现你的需求,不清楚.net是不是一样原理
谢谢你,.net其实也是可以用构造注入的,但是MVC框架中有一个基类中封装了一个方法,就是控制器必须有一个无参的空构造器,如果要使用构造注入,那就必须把基类中那个方法进行扩展,然后把我写的扩展方法注册到启动文件中,我是新手,就是写不出如何扩展。。。。。。
@iiiiiim: “MVC框架中有一个基类中封装了一个方法,就是控制器必须有一个无参的空构造器”,没有这种说法,你从哪看到的?还有,你完全可以换个思路,将ICalculator接口也交给Spring容器管理,然后通过属性注入。
@无恨之都: IDE这样来报错的,我之所以走构造注入,1. 我是初学,所以要弄懂他,其他方式也可以达到目的,这就是我坚持这样做的本意(如果换个方式实现我就不需要发帖子了),2. 我要做到低耦合,让两个类之间没有任何依赖关系