学习新东西,喜欢从简单的例子入手,感觉理解和上手会快点,本文记录下我做的一个简单的mef的例子,至于理论的话百度,谷歌多的去了.
Mef可以在你调整了某些功能的时候不需要重新去做代码,只需要换掉相应的dll就可以了.
MefDemo.Core:将当前日期以yyyy-MM-dd的格式返回
MefDemo.Core2:将当前日期以yyyy/MM/dd的格式返回
MefDemo.InterFace:接口,调用方和实现方的中间接口
MefDemo.Web:测试用的一个MVC程序
一、MefDemo.Core中的代码
二、MefDemo.Core2中的代码
三、MefDemo.InterFace的代码
四、MefDemo.Web的代码
Global.asax中的代码,红框是我们自己要写的,其余的是vs自动生成的。
其中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来测试
测试后我们会发现,当我们在MefDemo.Web项目的bin文件放的是MefDemo.Core.dll的时候,我们ViewBag.date得到的值是年份-月份-号数,当我们把bin文件里面的MefDemo.Core.dll替换为MefDemo.Core2.dll的时候,ViewBag.date得到的值就为年份/月份、号数。好了,入门的demo就到这里。