首页 新闻 会员 周边 捐助

MVC结合Autofac依赖注入后的问题

0
悬赏园豆:10 [已解决问题] 解决于 2016-10-25 21:30
 请问一下AutoFac 结合mvc 后,发现对服务层的调用只能在控制器中进行(控制器的构造函数中对声明的服务层接口赋值),如果想在别的WEB层以外的程序集中实现对服务层的调用,有没有什么别的思路?  
静心尽心的主页 静心尽心 | 初学一级 | 园豆:155
提问于:2016-10-25 15:06
< >
分享
最佳答案
0

为什么会在controller做这些事?这样做了还不如直接实例化接口的实现对象。

收获园豆:6
Daniel Cai | 专家六级 |园豆:10424 | 2016-10-25 15:18

我是在全局应用程序里使用的dependencysolver 方法注册的,这样不用在控制器中,不用关心服务层具体的实现对象,控制器会在容器中进行查找具体的示例,对于实例化的问题,我是比较不喜欢在程序中把接口与具体的实现进行绑定的.

静心尽心 | 园豆:155 (初学一级) | 2016-10-25 15:30

补充一点,如果实例化具体实现给服务接口赋值,那接口意义何在呢,层与层之间的交互应该直接只是通过接口进行吧

静心尽心 | 园豆:155 (初学一级) | 2016-10-25 15:34

@静心尽心: 理解错了,你这样直接提个静态方法出来完成注册的事就不可以了么?

Daniel Cai | 园豆:10424 (专家六级) | 2016-10-25 15:37

@Daniel Cai: 我是使用的 Autofac.Integration.Mvc 来在应用程序启动时 注册的,这个和MVC 结合后,可以在控制器的构造函数内直接对服务层的接口赋值【如下代码】,一般不是这样使用的吗?

private readonly IUserService _userService;

private readonly IRoleService _rolesService;
public UserController(IUserService UserService, IRoleService RolesService)
{
_userService = UserService;
_rolesService = RolesService;
}

静心尽心 | 园豆:155 (初学一级) | 2016-10-25 15:47

@静心尽心: 你是要复用controller中的逻辑么?

Daniel Cai | 园豆:10424 (专家六级) | 2016-10-25 16:00

@Daniel Cai: 目测如果还是使用Autofac.Integration.Mvc ,就要实现controller的逻辑了,不过,感觉这样挺抠脚的

静心尽心 | 园豆:155 (初学一级) | 2016-10-25 16:04

@静心尽心: 这个地方我感觉按照你的新需求来做的话,那么controller这层实际完成了service层的功能,也就是现在的controller中的功能要下移到service层中才能达到你所谓的效果。

在保留现有controller的基础上你可以单独起一层service层,通过前面的注册及手动resolve来解决di的问题。

Daniel Cai | 园豆:10424 (专家六级) | 2016-10-25 16:14

@Daniel Cai: 是我理解错了,把AutoFac 注册与控制器激活混在一起了,正确的方式应该在单独注册container,在全局引用

静心尽心 | 园豆:155 (初学一级) | 2016-10-25 21:29
其他回答(1)
0

如果是autofac的话。

mvc是controller ctor里面自动完成注入。

如果是其他项目,可以使用container.resolve来获取service

service 依赖的任何其他service或者其他项都可以通过service的ctor自动注入

收获园豆:4
czd890 | 园豆:14488 (专家六级) | 2016-10-25 18:36

如果其他项目中使用的话,就是说要重新注册容器了,不然  container.resolve 是取不到值的,这是我测试的结果,但是一个解决方案里多次注册的话,是否合理呢

支持(0) 反对(0) 静心尽心 | 园豆:155 (初学一级) | 2016-10-25 20:54

是我理解错了,把AutoFac 注册与控制器激活混在一起了,正确的方式应该在单独注册container,在全局引用

支持(0) 反对(0) 静心尽心 | 园豆:155 (初学一级) | 2016-10-25 21:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册