前言
在/aehyok/p/3386650.html前面一节主要是对MEF进行简单的介绍。本节主要来介绍如何在 Mvc3.0中使用MEF。
准备工作
首先建立一个 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 position;
实现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 MVC!" + Repository.GetTestString();return View();}
就是为需要的部件进行属性的标注
通过依赖注入的实现的确找到了该调用的实例。并查看最终的运行效果。
总结
自己感觉很不错,希望能应用到实际的开发项目中。
简单的实例代码下载地址/share/link?shareid=224012114&uk=4244870074