前言
在http://www.cnblogs.com/aehyok/p/3386650.html前面一節主要是對MEF進行簡單的介紹。本節主要來介紹如何在Asp.Net Mvc3.0中使用MEF。
准備工作
首先建立一個Asp.Net Mvc3.0的Web項目。然后建立一個業務邏輯處理的類庫項目。
在MEF.Repository類庫項目中建立一個ITestRepository的接口
namespace MEF.Repository { public interface ITestRepository { string GetTestString(); } }
以及它的一個實現類
[Export(typeof(ITestRepository))] public class TestRepository:ITestRepository { public string GetTestString() { return "Hello World"; } }
可以看到我們已經為其標記了Export的導出屬性,它的類型為上面聲明的接口ITestRepository。
記得還需要引用命名空間
using System.ComponentModel.Composition;
實現MEF的注入工作
步驟大概分為四步
第一步:發現部件---這種方式是通過讀取當前程序下的dll文件中的部件
第二步:為第一步中獲取到的部件創建一個CompositionContainer實例
第三步:實現IDependencyResolver接口
第四步:注冊到DependencyResolver
//設置MEF依賴注入容器 DirectoryCatalog catalog = new DirectoryCatalog(AppDomain.CurrentDomain.SetupInformation.PrivateBinPath); MefDependencySolver solver = new MefDependencySolver(catalog); DependencyResolver.SetResolver(solver);
這是在Global.asax文件下的Application_Start方法執行的文件,里面有一個自定義的MefDependencySolver
public class MefDependencySolver : IDependencyResolver { private readonly ComposablePartCatalog _catalog; private const string MefContainerKey = "MefContainerKey"; public MefDependencySolver(ComposablePartCatalog catalog) { _catalog = catalog; } public CompositionContainer Container { get { if (!HttpContext.Current.Items.Contains(MefContainerKey)) { HttpContext.Current.Items.Add(MefContainerKey, new CompositionContainer(_catalog)); } CompositionContainer container = (CompositionContainer)HttpContext.Current.Items[MefContainerKey]; HttpContext.Current.Application["Container"] = container; return container; } } public object GetService(Type serviceType) { string contractName = AttributedModelServices.GetContractName(serviceType); return Container.GetExportedValueOrDefault<object>(contractName); } public IEnumerable<object> GetServices(Type serviceType) { return Container.GetExportedValues<object>(serviceType.FullName); } } }
里面定義創建了CompositionContainer對象實例,並繼承接口IDependencyResolver實現方法
並最終完成注冊到DependencyResolver。
接下來就是需要實現調用了
[Export] public class HomeController : Controller { [Import] public ITestRepository Repository { get; set; } public ActionResult Index() { Repository.GetTestString(); ViewBag.Message = "Welcome to ASP.NET MVC!" + Repository.GetTestString(); return View(); }
就是為需要的部件進行屬性的標注
通過依賴注入的實現的確找到了該調用的實例。並查看最終的運行效果。
總結
自己感覺很不錯,希望能應用到實際的開發項目中。
簡單的實例代碼下載地址 http://pan.baidu.com/share/link?shareid=224012114&uk=4244870074