阅读目录
Mvc中使用Autofac
前面学习了AutoFac的注册、解析、生命周期,这里写一个AutoFac在ASP.NET MVC中的简单使用。
基本结构:AutoFacMvc作为ui层 ,IService类库(各种服务接口),Service类库(IService中接口的实现),Model类库(数据模型,这里使用EF)
我们的目的:实现MVC中的Controller和Service中的具体实现类解耦
获取用户列表的简单例子:
IService中的接口:
namespace IService { public interface IUserInfoService { List<UserInfo> GetUsers(); } }
Service中的实现:
namespace Service { public class UserInfoService : IUserInfoService { //获取用户列表 public List<Model.UserInfo> GetUsers() { DbContext context = DbFactory.GetDbContext(); return context.Set<UserInfo>().ToList<UserInfo>(); } } }
第一步:在mvc中添加dll文件,可以通过Nuget直接添加
第二步:在App_Start文件夹中添加一个AutofacConfig类
1 public class AutofacConfig 2 { 3 /// <summary> 4 /// 负责调用autofac框架实现业务逻辑层和数据仓储层程序集中的类型对象的创建 5 /// 负责创建MVC控制器类的对象(调用控制器中的有参构造函数),接管DefaultControllerFactory的工作 6 /// </summary> 7 public static void Register() 8 { 9 //实例化一个autofac的创建容器 10 var builder = new ContainerBuilder(); 11 //告诉Autofac框架,将来要创建的控制器类存放在哪个程序集 (AutoFacMvcDemo) 12 Assembly controllerAss = Assembly.Load("AutoFacMvcDemo"); 13 builder.RegisterControllers(controllerAss); 14 15 //如果有Dal层的话,注册Dal层的组件 16 //告诉autofac框架注册数据仓储层所在程序集中的所有类的对象实例 17 //Assembly dalAss = Assembly.Load("Dal"); 18 //创建respAss中的所有类的instance以此类的实现接口存储 19 //builder.RegisterTypes(dalAss.GetTypes()).AsImplementedInterfaces(); 20 21 //告诉autofac框架注册业务逻辑层所在程序集中的所有类的对象实例 22 Assembly serviceAss = Assembly.Load("Service"); 23 //创建serAss中的所有类的instance以此类的实现接口存储 24 builder.RegisterTypes(serviceAss.GetTypes()).AsImplementedInterfaces(); 25 26 27 //创建一个Autofac的容器 28 var container = builder.Build(); 29 //将MVC的控制器对象实例 交由autofac来创建 30 DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 31 } 32 }
第三步:在Global.asax调用AutofacConfig类中的Register方法,注册组件
1 public class MvcApplication : System.Web.HttpApplication 2 { 3 protected void Application_Start() 4 { 5 AreaRegistration.RegisterAllAreas(); 6 RouteConfig.RegisterRoutes(RouteTable.Routes); 7 //注册组件 8 AutofacConfig.Register(); 9 } 10 }
第四步:简单测试
UserInfoController :
1 namespace AutoFacMvcDemo.Controllers 2 { 3 public class UserInfoController : Controller 4 { 5 private IUserInfoService userinfoService; 6 //通过构造器注入依赖 7 public UserInfoController(IUserInfoService _userinfoService) 8 { 9 userinfoService = _userinfoService; 10 } 11 12 public ActionResult Index() 13 { 14 //不使用autofac时,service层和mvc ui层强耦合 15 //UserInfoService userInfoService = new UserInfoService(); 16 //List<UserInfo> users= userInfoService.GetUsers(); 17 18 List<UserInfo> users= userinfoService.GetUsers(); 19 ViewBag.users = users; 20 return View(); 21 } 22 } 23 }
View
@{ ViewBag.Title = "Index"; } <h2>用户列表</h2> @* 简单展示用户 *@ <table> @foreach (var item in ViewBag.users) { <tr> <td>@item.UId</td> <td>@item.UserName</td> <td>@item.Age</td> </tr> } </table>
运行结果:
补充:可以逐个进行注册代码如下,在Application_Start方法中添加如下代码 :
//创建autofac管理注册类的容器实例 var builder = new ContainerBuilder(); //注册组件(注意:在注册时添加了UserInfoService的引用,其实还是耦合的,在不分层的项目中好用) builder.RegisterType<UserInfoService>().As<IUserInfoService>(); //使用Autofac提供的RegisterControllers扩展方法来对程序集中所有的Controller一次性的完成注册 builder.RegisterControllers(Assembly.GetExecutingAssembly()); //生成具体的实例 var container = builder.Build(); //下面就是使用MVC的扩展 更改了MVC中的注入方式. DependencyResolver.SetResolver(new AutofacDependencyResolver(container));