Routeコンポーネントの設計思考とモデルについて簡単に説明します

3202 ワード

RouteコンポーネントはASPといってもいいですが.NETの「ポータル」だが、これまでマイクロソフトに二等公民とされてきたようだ.独自のRouteクラスの機能が強すぎるためか、マイクロソフトの公式やコミュニティ内ではRouteBaseの拡張にあまり注目していません.しかし、ほとんどの場合、RouteBaseを拡張する必要はありません.実際、私は多くのRouteBaseクラスを構築したことがありますが、DomainRoute以外は諦めました.例えば、半年前に書いた「URL Routingを埋めないでください」で提供されたFormatRouteは、MvcPatchでもより良い代替品があります(数日後にはこの点についてお話しします).
RouteBaseの役割は、要求からデータを取得し、データに基づいて仮想パスを生成することです.GetRouteDataとGetVirtualPathの2つの方法しかありません.拡張が非常に簡単で、さまざまな「モード」が体現できます.たとえばDomainRouteとFormatRouteは、装飾モードを使用しており、内部RouteBaseのGetRouteDataまたはGetVirtualPathメソッドの「前後」にいくつかの論理(DomainRouteのドメイン名マッチングや生成など)を加えています.興味深いことに、数ヶ月前にInterceptRouteクラスを書いたことがあります.
public class InterceptRoute : RouteBase
{
    public InterceptRoute(RouteBase innerRoute, IList<IRouteInterceptor> interceptors)
    {
        this.InnerRoute = innerRoute;
        this.Interceptors = new InterceptorCollection(interceptors);
    }

    public RouteBase InnerRoute { get; private set; }

    public InterceptorCollection Interceptors { get; private set; }

    ...
}

多くの場合、1つのコンポーネントに「横断」を挿入できる論理は常に有用であり(例えば、昨日提案したNHibernate Interceptor)、上記はRouteルールの各方法の前後に様々な論理を挿入することである.この論理を提供するのはIrouteInterceptorオブジェクトで、4つの方法があります.
  • PreGetRouteData
  • PostGetRouteData
  • PreGetVirtualPath
  • PostGetVirtualPath

  • 名前からも何をしているのかがわかります.理論的には、DomainRouteでもFormatRouteでも、既存の方法の前/後論理の拡張を補完する限り、IrouteInterceptorを提供することによって実現することができる.しかし、私はDomainRoute以外に、他の使用環境を発見していません.このInterceptRouteも娯楽価値が実際の価値より大きいようだ.だからここで話して、後で突然本当に役に立つことに気づいたら、私たちはまた散歩に出します.
    デコライザモード/InterceptRouteの他に、InterceptRouteのように実用的な用途を提供しない別の「構造性」(InterceptRouteのように)のRoute拡張を構築したいと思ったことがあります.それは、コンビネーションモードを利用したRouteルールです.コンビネーション・モードでは、複数のRouteBaseオブジェクトを集約し、GetRouteDataまたはGetVirtualPathのときにこれらのオブジェクトに職責を委任できます.実際、その職責はRoutingフレームワーク自体が持っているRouteCollectionのようなものです.もちろん、前にも話したように、RouteCollectionの論理はそんなに単純ではありません.
    このようなCompositeRouteオブジェクトがRouteルールを集めているとしたら、いつこのようなシーンが必要になりますか?実はDomainRouteはこのようにすることができて、“1つのドメイン名の下で複数のRouteの規則があります”はまるで当たり前のことです.しかし、実はそんなに簡単なことではありません.その原因は私たちが昨日話した「命名問題」です.
    Routeルールを構成する場合、Routeごとに名前を指定します.しかし、この名前はRouteCollectionにしか効果がありません.正確にはRouteTableのみです.RoutesというRouteCollectionインスタンスが使用されます.このように,CompositeRouteを用いることで,本来名前を持つことができる複数のRouteルールを必ず縛り付け,我々はURLを生成する際に名前で特定のRouteに位置付けることができなくなる.
    RouteCollectionでは解放インタフェースが限られているため(オープンソースでもないため、これは私たちがそれを改造できないことを意味します)、この点はほとんどカスタムロジックで改善できません.だから私から見れば、CompositeRouteはほとんどどんなシーンでも使えない--DomainRouteももちろんこのようなデザインは使いません.