MEF在WebApi中应用


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来做依赖注入。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值