前言
在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