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 web.config授权设置
- asp.net-mvc – ASP.Net MVC – 处理多个复选框
- asp.net – 实体框架:“底层提供商在Open上失败”
- iis – 如何从服务器上的经典asp页面执行bat文件
- asp.net-mvc – ASP.NET MVC中基础控制器类的好候选人是什么
- asp.net-mvc – 如何只允许mvc4 razor中的文本框中的数字
- asp.net – IE bug无效源HTML5音频 – 解决方法
- ASP.net检查页面是http还是https
- 在ASP.NET中实现多文件上传的方法
- 使用ASP.NET Web API 2.1配置依赖注入
- asp.net – Mocking HttpContext不起作用
- asp.net-mvc – 无法加载指定的元数据资源
- asp.net-mvc – 在ASP.NET MVC中的NHibernate会话
- 在ASP.Net网站上使用WCF服务的教程?
- iis-7 – ASP 3.0应用程序对象
- asp.net-mvc-3 – MVC3剃须刀:是否可以渲染传统
- ASP.NET LinkButton / ImageButton和JQuery验证?
- asp.net-mvc – $.ajax({async:false})请求仍然
- asp.net-mvc-4 – Kendo UI组合框复位值
- asp.net-mvc – Asp.Net MVC:一些非本地化的默认
