1.MEF在MVC中和在WebApi中的初始化,是用区别的,他们分别实现的接口如下:
//WebApi需要实现的接口
System.Web.Http.Dependencies.IDependencyResolver
//MVC需要实现的接口
System.Web.Mvc.IDependencyResolver
2.MEF的代码如下:
/*******************************************************************************
* Copyright (C) JuCheap.Com
*
* Author: dj.wong
* Create Date: 2015/8/21
* Description: Automated building by service@jucheap.com
*
* Revision History:
* Date Author Description
*
*********************************************************************************/
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.ComponentModel.Composition.Primitives;
using System.Web;
using System.Web.Http.Dependencies;
namespace WebApplication1
{
/// <summary>
/// MEF IOC
/// </summary>
public class MefDependencySolver : System.Web.Http.Dependencies.IDependencyResolver, System.Web.Mvc.IDependencyResolver
{
private readonly ComposablePartCatalog _catalog;
private const string MefContainerKey = "JuCheap_MefContainerKey";
/// <summary>
/// MefDependencySolver
/// </summary>
/// <param name="catalog"></param>
public MefDependencySolver(ComposablePartCatalog catalog)
{
_catalog = catalog;
}
/// <summary>
/// Container
/// </summary>
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
/// <summary>
/// GetService
/// </summary>
/// <param name="serviceType"></param>
/// <returns></returns>
public object GetService(Type serviceType)
{
string contractName = AttributedModelServices.GetContractName(serviceType);
return Container.GetExportedValueOrDefault<object>(contractName);
}
/// <summary>
/// GetServices
/// </summary>
/// <param name="serviceType"></param>
/// <returns></returns>
public IEnumerable<object> GetServices(Type serviceType)
{
return Container.GetExportedValues<object>(AttributedModelServices.GetContractName(serviceType));
}
/// <summary>
/// BeginScope
/// </summary>
/// <returns></returns>
public IDependencyScope BeginScope()
{
return new MefDependencySolver(_catalog);
}
#endregion
public void Dispose()
{
//ToDo
}
}
}
3.在WebApiConfig.cs文件中,设置mef的初始化,代码如下:
//初始化MEF配置
DirectoryCatalog catalog = new DirectoryCatalog(AppDomain.CurrentDomain.SetupInformation.PrivateBinPath);
MefDependencySolver solver = new MefDependencySolver(catalog);
config.DependencyResolver = solver;
运行的效果如下图:
从上图看到,我们的MEF已经可以在webapi项目中正常运行了
上例仅供参考,实际项目中,推荐AutoFac和SimpleInject来做依赖注入。