C#.NET MVC中IOC容器 AutoFac的簡單使用

網上查看了很多文章,照着複製的代碼,始終不對,後面發現有些是缺少引用,有些缺失代碼,我這裏也是照搬被人的代碼做了一些改動,先上項目結構圖:
新建WEB MVC項目,我使用的VS是2017版
新建WEB MVC項目
1,添加引用,使用nugut添加兩個引用:Autofac,Autofac.Mvc5(很多別的文章都沒有說要添加Autofac.Mvc5,可能是使用的版本不一樣,這裏都使用的最新版)
2,Model添加一個實體類

    public class UserInfo
    {
        public string Name { get; set; }

        public int Age { get; set; }
    }

3,Iservice添加一個接口

    public interface IUserInfoService
    {
        List<UserInfo> GetUsers();
    }

4,Service實現接口

  public class UserInfoService : IUserInfoService
    {
        public List<UserInfo> GetUsers()
        {

            var list = new List<UserInfo>();
            list.Add(new UserInfo { Age = 18, Name = "張三" });
            list.Add(new UserInfo { Age = 25, Name = "李四" });
            list.Add(new UserInfo { Age = 25, Name = "王五" });
            return list;
        }
    }

5,正式使用,在MVC項目中創建一個autofac的註冊類

  public class AutofacConfig
    {
        /// <summary>
        /// 負責調用autofac框架實現業務邏輯層和數據倉儲層程序集中的類型對象的創建
        /// 負責創建MVC控制器類的對象(調用控制器中的有參構造函數),接管DefaultControllerFactory的工作
        /// </summary>
        public static void Register()
        {
            //實例化一個autofac的創建容器
            var builder = new ContainerBuilder();

            //告訴Autofac框架,將來要創建的控制器類存放在哪個程序集 (AutoFacMvcDemo)
            Assembly controllerAss = Assembly.Load("AutofacIOCDemo");
            builder.RegisterAssemblyModules(controllerAss);
	
            builder.RegisterControllers(Assembly.GetExecutingAssembly());

            //如果有Dal層的話,註冊Dal層的組件
            //告訴autofac框架註冊數據倉儲層所在程序集中的所有類的對象實例
            //Assembly dalAss = Assembly.Load("IService");
            //創建respAss中的所有類的instance以此類的實現接口存儲
            //builder.RegisterTypes(dalAss.GetTypes()).AsImplementedInterfaces();

            //告訴autofac框架註冊業務邏輯層所在程序集中的所有類的對象實例
            Assembly serviceAss = Assembly.Load("Service");

            //創建serAss中的所有類的instance以此類的實現接口存儲
            builder.RegisterTypes(serviceAss.GetTypes()).AsImplementedInterfaces();


            //創建一個Autofac的容器
            var container = builder.Build();
            //將MVC的控制器對象實例 交由autofac來創建
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        }
    }

6,在Global的Application_Start中啓用autofac註冊類

 protected void Application_Start()
        {
   			//註冊
            AutofacConfig.Register();

            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }

7,在控制器中調用獲取userinfo數據,並在視圖中展示出來

        private IUserInfoService userinfoService;
        public HomeController(IUserInfoService _userinfoService,) {
             userinfoService = _userinfoService;
        }
        public ActionResult Index()
        {
            List<UserInfo> users = userinfoService.GetUsers();
             ViewBag.users = users;
            return View();
        }
@{
    ViewBag.Title = "Home Page";
}

@foreach (var item in ViewBag.users)
{
    <tr>
        <td>@item.Age</td>
        <td>@item.Name</td>
    </tr>
}

8,補充單個註冊的方式,之前的方式是用註冊類註冊所有的Service,這裏是單個註冊,不用註冊類

   protected void 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));



            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }

9,原文地址:https://www.cnblogs.com/wyy1234/p/9144669.html,我這裏做了一點改動,剛學習,有不對的地方或者可以改進的地方請大家指點一下,謝謝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章