Asp.Net Mvc3.0(MEF依賴注入實例)


前言

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

 

 

 

 


免責聲明!

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



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