• 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

  • 相关阅读:
    实践详细篇-Windows下使用Caffe训练自己的Caffemodel数据集并进行图像分类
    实践详细篇-Windows下使用VS2015编译的Caffe训练mnist数据集
    实践详细篇-Windows下使用VS2015编译安装Caffe环境(CPU ONLY)
    Linux上rpm实战搭建FTP服务器
    Idea打包Maven项目
    修改Idea默认的全局设置,如Maven等
    IntelliJ IDEA 项目结构旁边出现 0%classes,0% lines covered
    Idea中JDK为1.8,还提示Diamond types are not supported at this language level
    如何避免在父类转换到子类时发生java.lang.ClassCastException
    HashMap常用方法总结
  • 原文地址:https://www.cnblogs.com/aehyok/p/3388874.html
Copyright © 2020-2023  润新知