前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Asp.Net Mvc3.0(MEF依赖注入实例)

Asp.Net Mvc3.0(MEF依赖注入实例)

作者头像
aehyok
发布2018-09-11 13:09:28
5900
发布2018-09-11 13:09:28
举报
文章被收录于专栏:技术博客技术博客

前言

https://cloud.tencent.com/developer/article/1395151前面一节主要是对MEF进行简单的介绍。本节主要来介绍如何在Asp.Net Mvc3.0中使用MEF。

准备工作

 首先建立一个Asp.Net Mvc3.0的Web项目。然后建立一个业务逻辑处理的类库项目。

在MEF.Repository类库项目中建立一个ITestRepository的接口

代码语言:javascript
复制
namespace MEF.Repository
{
    public interface ITestRepository
    {
        string GetTestString();
    }
}

以及它的一个实现类

代码语言:javascript
复制
    [Export(typeof(ITestRepository))]
    public class TestRepository:ITestRepository
    {
        public string GetTestString()
        {
            return "Hello World";
        }
    }

可以看到我们已经为其标记了Export的导出属性,它的类型为上面声明的接口ITestRepository。

记得还需要引用命名空间

代码语言:javascript
复制
using System.ComponentModel.Composition;

实现MEF的注入工作

 步骤大概分为四步

第一步:发现部件---这种方式是通过读取当前程序下的dll文件中的部件

第二步:为第一步中获取到的部件创建一个CompositionContainer实例

第三步:实现IDependencyResolver接口

第四步:注册到DependencyResolver

代码语言:javascript
复制
            //设置MEF依赖注入容器
            DirectoryCatalog catalog = new DirectoryCatalog(AppDomain.CurrentDomain.SetupInformation.PrivateBinPath);
            MefDependencySolver solver = new MefDependencySolver(catalog);
            DependencyResolver.SetResolver(solver);

这是在Global.asax文件下的Application_Start方法执行的文件,里面有一个自定义的MefDependencySolver

代码语言:javascript
复制
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。

接下来就是需要实现调用了

代码语言:javascript
复制
    [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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013-10-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档