问大家一个C# MVC的问题 页面上通过 /Home/Index链接方式 访问 控制器中的方法(这个方法属于类) 这个类的构造函数是如何执行的?,参数是怎么传的? 参数是怎么定义的?
页面上通过 Repair/Index 访问方法
图片中 这个构造函数是什么时候执行的? ,参数是怎么传的? 参数是怎么定义的?
控制器的构造函数由asp.net mvc框架内部调用。
它的参数由IOC容器负责提供。这里使用了构造函数方式的依赖注入。
那他怎么知道我传的是哪个对象,
或者说 如果我在 构造函数 里面定义一个学生类 ,那 学生类对象是什么呢?难道为空?
或者不为空,里面属性值为多少呢? 难道是默认值?
那如果在构造函数里面 定义 string,int 这种类型 值为多少呢? 也是默认值?
你贴的这个代码截图应该是IOC,百度一下“依赖注入”,“Autofac”
简单来说是这样的:
某单位大院进来一封信(Request)
看门王大爷对照通讯录(Router)看了一下地址
是寄到Home部门(Controller)Index收(Action)
然后王大爷就去送信了,到了办公室门口(Controller的构造函数)发现这个办公室需要一堆的介绍信和材料(参数)才能进去
之后王大爷就又跑去找专门管开具材料的部门(IOC/DI)来开足了材料,这才进去把信送给了Index
而中间这个办公室需要什么材料,该开什么证明,不需要你寄信的人关心,只要开具材料的部门(IOC)能开出这份材料(容器里有明确对应类型的映射),王大爷就能把信送到
那容器 是定义在哪的呢?
@~雨落忧伤~: 如果是Fx的话,一般是在 Global.asax 的 Application_Start 里
Core的话,是在 Startup.cs 里的 ConfigureServices 方法中声明
当然,一般做架构都会多多少少有封装,例如我用的比较的Autofac,在Fx里我就封装了一个方法
其中 DependencyResolver.SetResolver(IDependencyResolver resolver) 的官方注释是这样的
使用指定的依赖关系解析程序接口,为依赖关系解析程序提供一个注册点。
根据注释,说明使用这个方法我们就可以完成对依赖注入的相关注册工作,我们需要一个实现IDependencyResolver的实例。这个实例里包含了关于当前应用需要的依赖注入配置。
DependencyInjectionConfig.Register() 这个是我自己封装的方法,就是返回注入实例。
代码大致如下, 我用的Autofac,你手里的代码可能用的是其他的IOC,请根据实际情况判断
1 public class DependencyInjectionConfig 2 { 3 public static AutofacDependencyResolver Register() 4 { 5 var builder = new ContainerBuilder() 6 7 //.............. 8 9 builder.RegisterType<CurrentUser>().As<ICurrentUser>(); 10 11 //.................. 12 //注册当前项目下所有控制器 13 builder.RegisterControllers(Assembly.GetExecutingAssembly()); 14 15 return new AutofacDependencyResolver(builder.Build()); 16 } 17 }
例如我的某个Controller的构造有ICurrentUser类型的参数,那么系统会自动创建一个CurrentUser类型的实例,来作为参数。
更多的注入配置,请自行百度Autofac或其他IOC的文档
@写代码的相声演员: mvc都是通过 DependencyResolver.SetResolver() 这种方式 添加到控制器的构造函数上面的吗?
@~雨落忧伤~: 微软爸爸的Fx框架上推荐是用这个 DependencyResolver.SetResolver(IDependencyResolver resolver) 方法来解决依赖注入的问题。
有的第三方IOC框架会提供一些隐式的注册的方式,具体还要看你首里代码所使用的IOC框架。
@写代码的相声演员: 都属于第三方的东西吧~
@~雨落忧伤~: Fx上基本上是的,微软官方貌似只提供了依赖注入容器接口,并未给出官方的构建方法。比较简单的都是采用Autofac,也有其他第三方的工具包。
Core上自带一套完整的依赖注入解决方案,从构建容器到注入一条龙,也可以使用第三方的。
@写代码的相声演员: 嗯嗯
@写代码的相声演员: 微软的Fx框架 是个什么东西呀?
@~雨落忧伤~:
.Net Framework 的简称 .net Fx 然后偷个懒就成了 Fx
@写代码的相声演员: 嗯嗯