如何与MEF ASP.NET MVC 4和ASP.NET Web API集成 [英] How to integrate MEF with ASP.NET MVC 4 and 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屋!