如何与MEF ASP.NET MVC 4和ASP.NET Web API集成 [英] How to integrate MEF with ASP.NET MVC 4 and ASP.NET Web API

查看:213
本文介绍了如何与MEF ASP.NET MVC 4和ASP.NET Web API集成的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

一个人如何在ASP.NET MVC 4和ASP.NET的Web API托管扩展框架(MEF)整合同一个项目?

考虑一个示例应用程序,用一个MVC控制器的HomeController 和一个Web API控制器的ContactController 。两人都键入 IContactRepository ,他们依靠MEF解决的一个属性。现在的问题是如何以堵塞MEF到MVC和网页API,使实例通过MEF创建

HomeController的:

  ///<总结>
/// Home控制器。指导MEF创建每个进口商这个类的一个实例,
/// MVC所期待的,因为这是。
///< /总结>
[出口]
[PartCreationPolicy(CreationPolicy.NonShared)
公共类HomeController的:控制器
{
    [进口]
    私人IContactRepository _contactRepository = NULL;    公众的ActionResult指数()
    {
        返回查看(_contactRepository.GetAllContacts());
    }
}

的ContactController:

  ///<总结>
///联系人API控制器。指导MEF创建每个进口商这个类的一个实例,
///因为这是什么是Web API的期望。
///< /总结>
[出口]
[PartCreationPolicy(CreationPolicy.NonShared)
公共类的ContactController:ApiController
{
    [进口]
    私人IContactRepository _contactRepo = NULL;    公众联系[]得到()
    {
        返回_contactRepo.GetAllContacts();
    }
}

IContactRepository和ContactRepository:

 公共接口IContactRepository
{
    联系[] GetAllContacts();
}[导出(typeof运算(IContactRepository))]
公共类ContactRepository:IContactRepository
{
    公众联系[] GetAllContacts()
    {
        返回新的联系[] {
            新的联系人{ID = 1,名称=格伦贝克},
            新的联系人{ID = 2,名称=比尔O'Riley}
        };
    }
}

联系人:

 公共类联系
{
    公众诠释标识{搞定;组; }
    公共字符串名称{;组; }
}


解决方案是实施<一个href=\"http://msdn.microsoft.com/en-us/library/system.web.mvc.idependencyresolver%28v=vs.98%29.aspx\">System.Web.Mvc.IDependencyResolver和<一个href=\"http://msdn.microsoft.com/en-us/library/system.web.http.dependencies.idependencyresolver%28v=vs.108%29.aspx\">System.Web.Http.Dependencies.IDependencyResolver分别注册ASP.NET MVC和ASP.NET Web API的实现,在你的的Application_Start 方法。

在这个例子中,我们将创建一个类 MefConfig ,它实现了一个方法 RegisterMef 这会从名为的Application_Start ,以安装我们的依赖解析器。类 MefDependencyResolver 同时实现了 System.Web.Mvc.IDependencyResolver System.Web.Http .Dependencies.IDependencyResolver ,正因为如此,处理解决依赖职责为MVC和Web API。

的Application_Start,把这个在你的Global.asax.cs:

 公共类WebApiApplication:System.Web.HttpApplication
{
    保护无效的Application_Start()
    {
        [...]
        MefConfig.RegisterMef();
    }
}

MefDependencyResolver和MefConfig:

  ///&LT;总结&gt;
///解决依赖使用MEF MVC /网络API。
///&LT; /总结&gt;
公共类MefDependencyResolver:System.Web.Http.Dependencies.IDependencyResolver,System.Web.Mvc.IDependencyResolver
{
    私人只读CompositionContainer中_container;    公共MefDependencyResolver(CompositionContainer中容器)
    {
        _container =容器;
    }    公共IDependencyScope BeginScope()
    {
        返回此;
    }    ///&LT;总结&gt;
    ///调用请求服务实现。
    ///
    ///在此,我们呼吁MEF来实例化依赖的实现。
    ///&LT; /总结&gt;
    ///&LT; PARAM NAME =的serviceType&GT;服务类型要求与LT; /参数&GT;
    ///&LT;收益方式&gt;服务实现或空&LT; /回报&GT;
    公共对象GetService的(类型的serviceType)
    {
        如果(的serviceType == NULL)
            抛出新的ArgumentNullException(的serviceType);        变种名称= AttributedModelServices.GetContractName(的serviceType);
        VAR出口= _container.GetExportedValueOrDefault&LT;对象&gt;(名);
        返回出口;
    }    ///&LT;总结&gt;
    ///调用请求服务的实现。
    ///
    ///在此,我们呼吁MEF来实例化依赖的实现。
    ///&LT; /总结&gt;
    ///&LT; PARAM NAME =的serviceType&GT;服务类型要求与LT; /参数&GT;
    ///&LT;退货和GT;服务实现&LT; /回报&GT;
    公共IEnumerable的&LT;对象&gt; GetServices(类型的serviceType)
    {
        如果(的serviceType == NULL)
            抛出新的ArgumentNullException(的serviceType);        VAR出口= _container.GetExportedValues​​&LT;对象&gt;(AttributedModelServices.GetContractName(的serviceType));
        返回的出口;
    }    公共无效的Dispose()
    {
    }
}公共静态类MefConfig
{
    公共静态无效RegisterMef()
    {
        变种asmCatalog =新AssemblyCatalog(Assembly.GetExecutingAssembly());
        VAR集装箱=​​新CompositionContainer中(asmCatalog);
        VAR解析器=新MefDependencyResolver(容器);
        //安装用于MVC MEF依赖解析器
        DependencyResolver.SetResolver(旋);
        //安装的Web API MEF依赖解析器
        System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver =解析器;
    }
}

How does one integrate Managed Extensibility Framework (MEF) with ASP.NET MVC 4 and ASP.NET Web API in the same project?

Consider an example application, with an MVC controller HomeController and a Web API controller ContactController. Both have a property of type IContactRepository, which they rely on MEF to resolve. The problem is how to plug MEF into MVC and Web API, so that instances are created via MEF.

HomeController:

/// <summary>
/// Home controller. Instruct MEF to create one instance of this class per importer,
/// since this is what MVC expects.
/// </summary>
[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class HomeController : Controller
{
    [Import]
    private IContactRepository _contactRepository = null;

    public ActionResult Index()
    {
        return View(_contactRepository.GetAllContacts());
    }
}

ContactController:

/// <summary>
/// Contact API controller. Instruct MEF to create one instance of this class per importer,
/// since this is what Web API expects.
/// </summary>
[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class ContactController : ApiController
{
    [Import]
    private IContactRepository _contactRepo = null;

    public Contact[] Get()
    {
        return _contactRepo.GetAllContacts();
    }
}

IContactRepository and ContactRepository:

public interface IContactRepository
{
    Contact[] GetAllContacts();
}

[Export(typeof(IContactRepository))]
public class ContactRepository : IContactRepository
{
    public Contact[] GetAllContacts()
    {
        return new Contact[] {
            new Contact { Id = 1, Name = "Glenn Beck"},
            new Contact { Id = 2, Name = "Bill O'Riley"}
        };
    }
}

Contact:

public class Contact
{
    public int Id { get; set; }
    public string Name { get; set; }
}

解决方案

The solution is to implement System.Web.Mvc.IDependencyResolver and System.Web.Http.Dependencies.IDependencyResolver and register your implementation with ASP.NET MVC and ASP.NET Web API respectively, in your Application_Start method.

In this example we'll create a class MefConfig, which implements a method RegisterMef that gets called from Application_Start in order to install our dependency resolver. The class MefDependencyResolver implements both System.Web.Mvc.IDependencyResolver and System.Web.Http.Dependencies.IDependencyResolver and, as such, handles dependency resolution duties for both MVC and Web API.

Application_Start, Put This in Your Global.asax.cs:

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        [...]
        MefConfig.RegisterMef();
    }
}

MefDependencyResolver and MefConfig:

/// <summary>
/// Resolve dependencies for MVC / Web API using MEF.
/// </summary>
public class MefDependencyResolver : System.Web.Http.Dependencies.IDependencyResolver, System.Web.Mvc.IDependencyResolver
{
    private readonly CompositionContainer _container;

    public MefDependencyResolver(CompositionContainer container)
    {
        _container = container;
    }

    public IDependencyScope BeginScope()
    {
        return this;
    }

    /// <summary>
    /// Called to request a service implementation.
    /// 
    /// Here we call upon MEF to instantiate implementations of dependencies.
    /// </summary>
    /// <param name="serviceType">Type of service requested.</param>
    /// <returns>Service implementation or null.</returns>
    public object GetService(Type serviceType)
    {
        if (serviceType == null)
            throw new ArgumentNullException("serviceType");

        var name = AttributedModelServices.GetContractName(serviceType);
        var export = _container.GetExportedValueOrDefault<object>(name);
        return export;
    }

    /// <summary>
    /// Called to request service implementations.
    /// 
    /// Here we call upon MEF to instantiate implementations of dependencies.
    /// </summary>
    /// <param name="serviceType">Type of service requested.</param>
    /// <returns>Service implementations.</returns>
    public IEnumerable<object> GetServices(Type serviceType)
    {
        if (serviceType == null)
            throw new ArgumentNullException("serviceType");

        var exports = _container.GetExportedValues<object>(AttributedModelServices.GetContractName(serviceType));
        return exports;
    }

    public void Dispose()
    {
    }
}

public static class MefConfig
{
    public static void RegisterMef()
    {
        var asmCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
        var container = new CompositionContainer(asmCatalog);
        var resolver = new MefDependencyResolver(container);
        // Install MEF dependency resolver for MVC
        DependencyResolver.SetResolver(resolver);
        // Install MEF dependency resolver for Web API
        System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = resolver;
    }
}

这篇关于如何与MEF ASP.NET MVC 4和ASP.NET Web API集成的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆