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
分类:
Ioc模式
标签:
MVC项目开发中那些用到的知识点
, Ioc
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构