IoC之AutoFac(四)——AutoFac在MVC中的使用

时间:2023-03-09 06:00:41
IoC之AutoFac(四)——AutoFac在MVC中的使用

阅读目录


Mvc中使用Autofac

前面学习了AutoFac的注册、解析、生命周期,这里写一个AutoFac在ASP.NET MVC中的简单使用。

基本结构:AutoFacMvc作为ui层 ,IService类库(各种服务接口),Service类库(IService中接口的实现),Model类库(数据模型,这里使用EF)

我们的目的:实现MVC中的Controller和Service中的具体实现类解耦

IoC之AutoFac(四)——AutoFac在MVC中的使用

获取用户列表的简单例子:

IService中的接口:

IoC之AutoFac(四)——AutoFac在MVC中的使用
namespace IService
{
public interface IUserInfoService
{
List<UserInfo> GetUsers();
}
}
IoC之AutoFac(四)——AutoFac在MVC中的使用

Service中的实现:

IoC之AutoFac(四)——AutoFac在MVC中的使用
namespace Service
{
public class UserInfoService : IUserInfoService
{
//获取用户列表
public List<Model.UserInfo> GetUsers()
{
DbContext context = DbFactory.GetDbContext();
return context.Set<UserInfo>().ToList<UserInfo>();
}
}
}
IoC之AutoFac(四)——AutoFac在MVC中的使用

第一步:在mvc中添加dll文件,可以通过Nuget直接添加

IoC之AutoFac(四)——AutoFac在MVC中的使用

第二步:在App_Start文件夹中添加一个AutofacConfig类

IoC之AutoFac(四)——AutoFac在MVC中的使用
 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 }
IoC之AutoFac(四)——AutoFac在MVC中的使用

第三步:在Global.asax调用AutofacConfig类中的Register方法,注册组件

IoC之AutoFac(四)——AutoFac在MVC中的使用
 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 }
IoC之AutoFac(四)——AutoFac在MVC中的使用

第四步:简单测试

UserInfoController :
IoC之AutoFac(四)——AutoFac在MVC中的使用
 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 }
IoC之AutoFac(四)——AutoFac在MVC中的使用

View

IoC之AutoFac(四)——AutoFac在MVC中的使用
@{
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>
IoC之AutoFac(四)——AutoFac在MVC中的使用

运行结果:

IoC之AutoFac(四)——AutoFac在MVC中的使用


补充:可以逐个进行注册代码如下,在Application_Start方法中添加如下代码 :

IoC之AutoFac(四)——AutoFac在MVC中的使用
      //创建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));
IoC之AutoFac(四)——AutoFac在MVC中的使用