现在的位置: 主页 > 公司荣誉 > 文章列表

ASP.NET Web API下的HttpController激活:程序集的解

作者:合肥瑶海区海美电器服务部 来源:www.an128l.com 未知发布时间:2017-09-13 12:48:03
ASP.NET Web API下的HttpController激活:程序集的解析

HttpController的激活是由处于消息处理管道尾端的HttpRoutingDispatcher来完成的,具体来说是HttpRoutingDispatcher利用HttpControllerDispatcher实现了针对目标HttpController的激活和执行。激活目标HttpController的前提是能够正确解析出HttpController的真实类型,而类型解析需要针对加载的程序集,所以我们需要先来了解一个用于解析程序集的对象AssembliesResolver。在ASP.NET Web API的HttpController激活系统中,AssembliesResolver为目标HttpController的类型解析提供候选的程序集。换句话说,候选HttpController类型的选择范围仅限于定义在通过AssembliesResolver提供的程序集中的所有实现了IHttpController接口的类型。[本文已经同步到《How ASP.NET Web API Works?》]

目录
AssembliesResolver
ServicesContainer
DefaultAssembliesResolver
实例演示:自定义AssembliesResolver
WebHostAssembliesResolver
AssembliesResolver
所有的AssembliesResolver均实现了接口IAssembliesResolver。如下面的代码片断所示,IAssembliesResolver接口中仅仅定义了一个唯一的GetAssemblies方法,该方法返回的正是提供的程序集列表。

public interface IAssembliesResolver
{
ICollection<Assembly> GetAssemblies();
}默认使用的AssembliesResolver类型为DefaultAssembliesResolver。如下面的代码片断所示,DefaultAssembliesResolver在实现的GetAssemblies方法中直接返回的是当前应用程序域加载的所有程序集列表。

public class DefaultAssembliesResolver : IAssembliesResolver
{
public virtual ICollection<Assembly> GetAssemblies()
{
return AppDomain.CurrentDomain.GetAssemblies().ToList<Assembly>();
}
}我们说DefaultAssembliesResolver是默认使用的AssembliesResolver,那么默认的AssembliesResolver类型在ASP.NET Web API是如何确定的呢?要回答这个问题,就需要涉及到另一个重要的类型——ServicesContainer。

ServicesContainer
整个ASP.NET Web API框架就是一个处理请求的管道,这条类似于流水线的管道的每个环节都注册的相应的组件来完成某项独立的任务。这些“标准化”的组件一般都实现了某个预定义的接口。如果这些原生的组件不能满足我们的需求,我们完全可以通过实现相应的接口建自定义的组件,然后以某种形式将它们“注册安装”到这个管道上。我们可以将这些标准化的组件视为实现了某个接口的服务,那么ServicesContainer就是一个服务的容器。从某种意义上来说,我们可以将ServicesContainer理解为一个简单的IoC容器,它维护着一个服务接口类型与服务实例之间的映射,使我们可以可以根据服务接口类型获取对应的服务实例。

如下所示的代码片断列出了定义在抽象类ServicesContainer中的核心方法。我们可以通过调用方法Add、AddRange、Insert和Replace注册服务接口类型与具体服务实例对象之间的映射关系。针对服务接口类型获取对应的服务实例可以通过调用方法GetService或者GetServices方法来完成。方法FindIndex用于确定注册的目标服务实例在容器中的索引,另一个方法IsSingleService用于判断针对指定的服务接口类型是否仅仅注册了唯一一个服务实例。注册的匹配关系可以通过调用方法Remove、RmoveAll、RemoveAt和Clear方法进行删除。除此之外,ServicesContainer还实现了接口IDisposable,如果我们需要自定义ServicesContainer,可以通过重写虚方法Dispose完成对相应资源的释放。

public abstract class ServicesContainer : IDisposable
{
public void Add(Type serviceType, object service);
public void AddRange(Type serviceType, IEnumerable<object> services);
public void Insert(Type serviceType, int index, object service);
public void InsertRange(Type serviceType, int index, IEnumerable<object> services);
public void Replace(Type serviceType, object service);
public void ReplaceRange(Type serviceType, IEnumerable<object> services);

public abstract object GetService(Type serviceType);
public abstract IEnumerable<object> GetServices(Type serviceType);
public int FindIndex(Type serviceType, Predicate<object> match);
public abstract bool IsSingleService(Type serviceType);

public bool Remove(Type serviceType, object service);
public int RemoveAll(Type serviceType, Predicate<object> match);
public void RemoveAt(Type serviceType, int index);
public virtual void Clear(Type serviceType);

public virtual void Dispose();
}整个ASP.NET Web API的配置都是通过HttpConfiguration来完成,针对自定义“服务”的注册自然也不例外。如下面的代码片断所示,HttpConfiguration具有一个类型为ServicesContainer的只读属性Services,ASP.NET Web API的运行时框架使用的ServicesContainer正是它。除此之外,通过如下的代码片断我们还会发现:默认使用的ServicesContainer是一个类型为DefaultServices的对象,类型全名为System.Web.Http.Services.DefaultServices。

public class HttpConfiguration : IDisposable
{
//其他成员
public HttpConfiguration(HttpRouteCollection routes)
{
//其他操作
this.Services = new DefaultServices(this);
}
public ServicesContainer Services { get; }
}DefaultAssembliesResolver
再次将我们的关注点拉回到AssembliesResolver上面,作为ASP.NET Web API众多标准化组件之一,默认使用的AssembliesResolver自然应该注册在ServicesContainer上面。如下面的代码片断所示,默认使用DefaultServices在构造函数中默认注册的AssembliesResolver就是一个DefaultAssembliesResolver对象。

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉建网站公司 https://www.feimao666.com

上一篇:ASP.NET过滤器的应用 下一篇:最后一页