为什么会在controller做这些事?这样做了还不如直接实例化接口的实现对象。
我是在全局应用程序里使用的dependencysolver 方法注册的,这样不用在控制器中,不用关心服务层具体的实现对象,控制器会在容器中进行查找具体的示例,对于实例化的问题,我是比较不喜欢在程序中把接口与具体的实现进行绑定的.
补充一点,如果实例化具体实现给服务接口赋值,那接口意义何在呢,层与层之间的交互应该直接只是通过接口进行吧
@静心尽心: 理解错了,你这样直接提个静态方法出来完成注册的事就不可以了么?
@Daniel Cai: 我是使用的 Autofac.Integration.Mvc 来在应用程序启动时 注册的,这个和MVC 结合后,可以在控制器的构造函数内直接对服务层的接口赋值【如下代码】,一般不是这样使用的吗?
private readonly IUserService _userService;
private readonly IRoleService _rolesService;
public UserController(IUserService UserService, IRoleService RolesService)
{
_userService = UserService;
_rolesService = RolesService;
}
@静心尽心: 你是要复用controller中的逻辑么?
@Daniel Cai: 目测如果还是使用Autofac.Integration.Mvc ,就要实现controller的逻辑了,不过,感觉这样挺抠脚的
@静心尽心: 这个地方我感觉按照你的新需求来做的话,那么controller这层实际完成了service层的功能,也就是现在的controller中的功能要下移到service层中才能达到你所谓的效果。
在保留现有controller的基础上你可以单独起一层service层,通过前面的注册及手动resolve来解决di的问题。
@Daniel Cai: 是我理解错了,把AutoFac 注册与控制器激活混在一起了,正确的方式应该在单独注册container,在全局引用
如果是autofac的话。
mvc是controller ctor里面自动完成注入。
如果是其他项目,可以使用container.resolve来获取service
service 依赖的任何其他service或者其他项都可以通过service的ctor自动注入
如果其他项目中使用的话,就是说要重新注册容器了,不然 container.resolve 是取不到值的,这是我测试的结果,但是一个解决方案里多次注册的话,是否合理呢
是我理解错了,把AutoFac 注册与控制器激活混在一起了,正确的方式应该在单独注册container,在全局引用