zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    一、逻辑架构与存储引擎
    三、动态SQL
    九、装饰者模式
    二、Mapper映射文件
    八、适配器模式
    测试开发系列之Python开发mock接口(二)
    测试开发系列之Python开发mock接口(三)
    html基础
    seleniumWebdriver浏览器驱动信息汇总
    用30行代码开发一个上传、下载文件的接口
  • 原文地址:https://www.cnblogs.com/aehyok/p/3388874.html
Copyright © 2011-2022 走看看