IoC實踐--用Autofac實現MVC5.0的IoC控制反轉方法

來源:互聯網
上載者:User

標籤:lte   pre   電腦程式   搜尋   產品   product   屬性   項目   blog   

Autofac是一個.net平台下發效能還不錯的IoC架構,利用它可以實現依賴注入和控制反轉,使自己的軟體模組之間的耦合性大大降低,讓軟體擴充、維護更加容易。控制反轉(Inversion of Control,英文縮寫為IoC)是一個重要的物件導向編程的法則來削減電腦程式的耦合問題。下面我就用Autofac實現ASP.NET mvc5.0的IOC控制反轉的方法。這裡用到是vs2013,Autofac ASP.NET MVC 5 Integration和mvc 5.0。Autofac ASP.NET MVC 5 Integration是Autofac的MVC封裝庫,我們只需要很少的代碼就可以實現依賴注入。下面請看詳細執行個體。

1、下載安裝相關代碼在你的web項目右鍵選擇“管理nuget程式包”

 

選中左邊的聯機,然後在搜尋的輸入框輸入“autofac”

選中Autofac ASP.NET MVC 5 Integration,點擊安裝,這樣你的項目就下載Autofac ASP.NET MVC 5 Integration了這個相關的dll的引用,並自動給添加了相關引用。

2、案例展示定義一個業務介面IProductRepository,用來擷取所有產品 
public interface IProductRepository {        IQueryable<Product> Products { get; }}

 

定義一個業務具體類,實現IProductRepository介面
public class EFProductRepository : IProductRepository {        private EFDbContext context = new EFDbContext();        public IQueryable<Product> Products        {            get { return context.Products; }        }}

 

EFDbContext定義的EF類,我這裡是用EF架構來實現讀取資料庫記錄,當然你可以用純的ADO、或者其它架構如ibatis.Net、Nhibernate、dapper等。  2.1、定義一個Controller依賴IProductRepository介面
public class BuyController : Controller{ private IProductRepository repository; public BuyController(IProductRepository repo) {  repository = repo; }     //此處省略其它代碼}

 

2.2、綁定IProductRepository介面依賴的具體實現的類
using Autofac;using Autofac.Integration.Mvc;using System;using System.Collections.Generic;using System.Configuration;using System.linq;using System.Web;using System.Web.Mvc;using WenMarine.BLL.Abstract;using WenMarine.BLL.Concrete;using WenMarine.Web.Infrastructure.Abstract;using WenMarine.Web.Infrastructure.Concrete;namespace WenMarine.Web.Infrastructure{    public class IocConfig    {        public static void RegisterDependencies()        {            var builder = new ContainerBuilder();            builder.RegisterControllers(typeof(MvcApplication).Assembly);           builder.RegisterType<EFProductRepository>().As<IProductRepository>();                           //autofac 註冊依賴            IContainer container = builder.Build();            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));        }    }}

 

 

2.3、調用IocConfig使依賴生效
protected void Application_Start(){ AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); IocConfig.RegisterDependencies();}

 

 3、總結通過上面可以看到,BuyController(高層模組)中是引用一個IProductRepository抽象介面而不是具體的實現EFProductRepository(具體模組)類。這樣做到依賴倒置,也就是控制反轉。這裡高層模組(BuyController)不依賴於底層模組(EFProductRepository裡面的讀取資料庫操作的低層代碼),二者都同依賴於抽象(IProductRepository);抽象不依賴於具體(EFProductRepository),具體依賴於抽象。這裡BuyController中的IProductRepository到底是哪個實現,是通過IocConfig類使用autofac的來註冊綁定的。這樣如果以後要更改資料庫讀取方式,考慮到效能問題,比如不用EF了架構了,要用Dapper,直接建立一個類DapperProductRepository繼承IProductRepository介面,實現Products 屬性。最後把IocConfig中builder.RegisterType<EFProductRepository>().As<IProductRepository>(); 改為builder.RegisterType<DapperProductRepository >().As<IProductRepository>(); 

就可以了。這樣BuyController高層的代碼根本不用改,這樣做到了對擴充開發,對修改關閉(OCP-物件導向的開放封閉原則),這個是物件導向程式設計的核心。很好的做到的松耦合,模組之間的耦合性大大降低,讓軟體擴充、維護更加容易。

 

下載

IoC實踐--用Autofac實現MVC5.0的IoC控制反轉方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.