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

阅读目录html

 


Mvc中使用Autofac

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

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

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

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

IService中的接口:测试

复制代码
namespace IService
{
    public interface IUserInfoService
    {
        List<UserInfo> GetUsers();
    }
}
复制代码

Service中的实现:ui

复制代码
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 }
复制代码

Viewspa

复制代码
@{
    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>
复制代码

运行结果:code


 

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

复制代码
      //建立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));
复制代码
相关文章
相关标签/搜索