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

 

 

 

 

posted @ 2013-10-26 10:59  aehyok  阅读(2492)  评论(5编辑  收藏  举报