首页 新闻 搜索 专区 学院

问大家一个C# MVC的问题 页面上通过 /Home/Index链接方式 访问方法 方法的 这个类的构造函数是如何执行的?,参数是怎么传的? 参数是怎么定义的?

0
[待解决问题]

问大家一个C# MVC的问题 页面上通过 /Home/Index链接方式  访问 控制器中的方法(这个方法属于类)  这个类的构造函数是如何执行的?,参数是怎么传的? 参数是怎么定义的?

 

页面上通过 Repair/Index 访问方法

图片中 这个构造函数是什么时候执行的? ,参数是怎么传的? 参数是怎么定义的?

~雨落忧伤~的主页 ~雨落忧伤~ | 菜鸟二级 | 园豆:336
提问于:2018-06-07 23:19
< >
分享
所有回答(2)
0

 控制器的构造函数由asp.net mvc框架内部调用。

它的参数由IOC容器负责提供。这里使用了构造函数方式的依赖注入。

西漠以西 | 园豆:1675 (小虾三级) | 2018-06-08 09:10

那他怎么知道我传的是哪个对象,

或者说 如果我在 构造函数 里面定义一个学生类 ,那 学生类对象是什么呢?难道为空? 

或者不为空,里面属性值为多少呢? 难道是默认值?

 

那如果在构造函数里面 定义 string,int 这种类型 值为多少呢? 也是默认值?

支持(0) 反对(0) ~雨落忧伤~ | 园豆:336 (菜鸟二级) | 2018-06-08 10:21
0

你贴的这个代码截图应该是IOC,百度一下“依赖注入”,“Autofac”

简单来说是这样的:

某单位大院进来一封信(Request)

看门王大爷对照通讯录(Router)看了一下地址

是寄到Home部门(Controller)Index收(Action)

然后王大爷就去送信了,到了办公室门口(Controller的构造函数)发现这个办公室需要一堆的介绍信和材料(参数)才能进去

之后王大爷就又跑去找专门管开具材料的部门(IOC/DI)来开足了材料,这才进去把信送给了Index

 

而中间这个办公室需要什么材料,该开什么证明,不需要你寄信的人关心,只要开具材料的部门(IOC)能开出这份材料(容器里有明确对应类型的映射),王大爷就能把信送到

写代码的相声演员 | 园豆:514 (小虾三级) | 2018-06-08 09:17

那容器 是定义在哪的呢?

支持(0) 反对(0) ~雨落忧伤~ | 园豆:336 (菜鸟二级) | 2018-06-08 10:23

@~雨落忧伤~: 如果是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的文档

支持(0) 反对(0) 写代码的相声演员 | 园豆:514 (小虾三级) | 2018-06-08 10:54

@写代码的相声演员: mvc都是通过 DependencyResolver.SetResolver() 这种方式 添加到控制器的构造函数上面的吗?

支持(0) 反对(0) ~雨落忧伤~ | 园豆:336 (菜鸟二级) | 2018-06-09 00:25

@~雨落忧伤~: 微软爸爸的Fx框架上推荐是用这个  DependencyResolver.SetResolver(IDependencyResolver resolver)  方法来解决依赖注入的问题。

有的第三方IOC框架会提供一些隐式的注册的方式,具体还要看你首里代码所使用的IOC框架。

支持(0) 反对(0) 写代码的相声演员 | 园豆:514 (小虾三级) | 2018-06-11 13:47

@写代码的相声演员: 都属于第三方的东西吧~

支持(0) 反对(0) ~雨落忧伤~ | 园豆:336 (菜鸟二级) | 2018-06-11 19:46

@~雨落忧伤~: Fx上基本上是的,微软官方貌似只提供了依赖注入容器接口,并未给出官方的构建方法。比较简单的都是采用Autofac,也有其他第三方的工具包。

Core上自带一套完整的依赖注入解决方案,从构建容器到注入一条龙,也可以使用第三方的。

支持(0) 反对(0) 写代码的相声演员 | 园豆:514 (小虾三级) | 2018-06-12 11:03

@写代码的相声演员: 嗯嗯

支持(0) 反对(0) ~雨落忧伤~ | 园豆:336 (菜鸟二级) | 2018-06-19 14:35

@写代码的相声演员: 微软的Fx框架 是个什么东西呀?

支持(0) 反对(0) ~雨落忧伤~ | 园豆:336 (菜鸟二级) | 2018-06-19 14:39

@~雨落忧伤~: 

.Net Framework 的简称 .net Fx 然后偷个懒就成了 Fx

支持(0) 反对(0) 写代码的相声演员 | 园豆:514 (小虾三级) | 2018-06-19 14:49

@写代码的相声演员: 嗯嗯

支持(0) 反对(0) ~雨落忧伤~ | 园豆:336 (菜鸟二级) | 2018-06-19 14:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册