zoukankan      html  css  js  c++  java
  • IoC之AutoFac(四)——AutoFac在MVC中的使用

    阅读目录


    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));
    复制代码
  • 相关阅读:
    知识加油站
    markdown 使用
    今日计划
    继续继续
    我回来了
    2020/5/8
    2020/5/10
    明天一定要学习了
    入驻博客园
    this is a test
  • 原文地址:https://www.cnblogs.com/Alex80/p/10703109.html
Copyright © 2011-2022 走看看