学习新东西,喜欢从简单的例子入手,感觉理解和上手会快点,本文记录下我做的一个简单的mef的例子,至于理论的话百度,谷歌多的去了.

Mef可以在你调整了某些功能的时候不需要重新去做代码,只需要换掉相应的dll就可以了.

.NET MEF入门级例子-LMLPHP

MefDemo.Core:将当前日期以yyyy-MM-dd的格式返回

MefDemo.Core2:将当前日期以yyyy/MM/dd的格式返回

MefDemo.InterFace:接口,调用方和实现方的中间接口

MefDemo.Web:测试用的一个MVC程序

一、MefDemo.Core中的代码

.NET MEF入门级例子-LMLPHP

.NET MEF入门级例子-LMLPHP

二、MefDemo.Core2中的代码

.NET MEF入门级例子-LMLPHP

.NET MEF入门级例子-LMLPHP

三、MefDemo.InterFace的代码

.NET MEF入门级例子-LMLPHP

.NET MEF入门级例子-LMLPHP

四、MefDemo.Web的代码

Global.asax中的代码,红框是我们自己要写的,其余的是vs自动生成的。

.NET MEF入门级例子-LMLPHP

其中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;
}
} #region IDependencyResolver Members 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);
} #endregion
}

最后一步,我们随便找一个controller来测试

.NET MEF入门级例子-LMLPHP

测试后我们会发现,当我们在MefDemo.Web项目的bin文件放的是MefDemo.Core.dll的时候,我们ViewBag.date得到的值是年份-月份-号数,当我们把bin文件里面的MefDemo.Core.dll替换为MefDemo.Core2.dll的时候,ViewBag.date得到的值就为年份/月份、号数。好了,入门的demo就到这里。

05-11 22:35