asp.net-mvc – 如何将MEF与ASP.NET MVC 4和ASP.NET Web API集成
如何在同一个项目中集成
Managed Extensibility Framework(MEF)与ASP.NET MVC 4和ASP.NET Web API?
考虑一个示例应用程序,一个MVC控制器HomeController和一个Web API控制器ContactController。两者都有属性类型IContactRepository,他们依靠MEF来解决。问题是如何将MEF插入MVC和Web API,以便通过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和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"} }; } } 联系: public class Contact { public int Id { get; set; } public string Name { get; set; } } 解决方法
解决方案是实现
System.Web.Mvc.IDependencyResolver和
System.Web.Http.Dependencies.IDependencyResolver,并在Application_Start方法中分别注册您的实现与ASP.NET MVC和ASP.NET Web API。
在这个例子中,我们将创建一个类MefConfig,它实现一个方法RegisterMef从Application_Start调用,以安装我们的依赖解析器。类MefDependencyResolver实现System.Web.Mvc.IDependencyResolver和System.Web.Http.Dependencies.IDependencyResolver,因此,处理对MVC和Web API的依赖关系解析职责。 Application_Start,把它放在你的Global.asax.cs中: public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { [...] MefConfig.RegisterMef(); } } MefDependencyResolver和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; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 从azure云存储下载大文件的最佳方式
- Razor 页面简化了 ASP.NET MVC 应用程序
- ASP.NET AJAX:在页面加载完成后触发UpdatePanel
- asp.net-mvc – ASP.net MVC数据注释DateTime默认值
- 使用asp.net中的web api通过http进行身份验证
- asp.net – 用于网页的SQL Reporting Services查看器 – 您
- asp.net-mvc – 无法获取脚本的程序集版本
- asp.net-mvc – 用于多个复选框表单的ASP.Net MVC6语法
- asp.net – 在MVC 3中的url中传递多个参数
- 强制ASP.NET GridView的寻呼机显示
- asp.net-mvc-3 – 需要帮助区分WebMatrix,ASP.NE
- 如何在ASP.NET Core WebAPI中使用Newtonsoft:Js
- asp.net-mvc – Web Api调用返回404错误,GUID作为
- 这个ASP.NET功能在哪里记录? <%= string forma
- asp.net-mvc-3 – 如何注入依赖项到global.asax.
- asp.net-mvc – ViewBag分配
- asp.net-mvc – 升级到.Net 4.5和osFamily 3后无
- .Net Core微服务入门全纪录(三)——Consul-服务
- asp.net – 如何使用Forms身份验证将用户重定向到
- 如何在Azure中部署和托管.NET Core自托管控制台应