.NET MEF入门级例证

.NET MEF入门级例子

 

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

 

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

 

.NET MEF入门级例证

 

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

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

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

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

 

一、MefDemo.Core中的代码

.NET MEF入门级例证

 

.NET MEF入门级例证

 

二、MefDemo.Core2中的代码

 

.NET MEF入门级例证

.NET MEF入门级例证

 

三、MefDemo.InterFace的代码

.NET MEF入门级例证

.NET MEF入门级例证

 

四、MefDemo.Web的代码

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

.NET MEF入门级例证

 

其中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入门级例证

 

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