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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM