2010-12-13 8 views
0

氏は述べています"処理するコードは" RouteCollection "とAreaRegistrationContext"のために複製されています。どちらのオブジェクトも私のコントロール(つまり.NET MVCフレームワーク)の外にありますが、一般的なインターフェイス/ベースクラスからは見えません。このことができますか?このような状況ではわからないは基本的にタイトルとして

public void Map(RouteCollection routes) 
    { 
     if (Details != null) 
     { 
      if (Namespaces != null) 
       routes.MapRoute(Name, Url, Details, Namespaces); 
      else 
      { 
       routes.MapRoute(Name, Url, Details); 
      } 
     } 
     else 
     { 
      if (Namespaces != null) 
       routes.MapRoute(Name, Url, Namespaces); 
      else 
      { 
       routes.MapRoute(Name, Url); 
      } 
     } 
    } 

    public void Map(AreaRegistrationContext context) 
    { 
     if (Details != null) 
     { 
      if (Namespaces != null) 
       context.MapRoute(Name, Url, Details, Namespaces); 
      else 
      { 
       context.MapRoute(Name, Url, Details); 
      } 
     } 
     else 
     { 
      if (Namespaces != null) 
       context.MapRoute(Name, Url, Namespaces); 
      else 
      { 
       context.MapRoute(Name, Url); 
      } 
     } 
    } 

答えて

0

をコードの重複を削除し、私は実際にはルート登録に別の方法を行ってきました。代わりにエリアをこのように使用するのでは、私が実際にインタフェースを作成しIRouteRegistrar WHI私はオーダーレジストラを作ることができます。私の例では、MEFに固有のものですが、あなたは他のどののIoC/SLの実装のために同じメカニズムを使用することはできません理由はありません。このシンプルなインタフェースにルート登録を抽象化することにより

/// <summary> 
/// Defines the required contract for implementing a route registrar. 
/// </summary> 
public interface IRouteRegistrar 
{ 
    #region Methods 
    /// <summary> 
    /// Registers any required routes. 
    /// </summary> 
    /// <param name="route">The route collection to register routes with.</param> 
    void RegisterRoutes(RouteCollection route); 
    #endregion 
} 

が、私はそれをたくさん見つけますモジュラーでテスト可能。

/// <summary> 
/// Registers any required routes with the routing system. 
/// </summary> 
[ExportBootstrapperTask("RegisterRoutes")] 
public class RegisterRoutesBootstrapperTask : IBootstrapperTask 
{ 
    #region Methods 
    /// <summary> 
    /// Runs the task. 
    /// </summary> 
    /// <param name="container"></param> 
    public void Run(CompositionContainer container) 
    { 
     Throw.IfArgumentNull(container, "container"); 

     var registrars = container 
      .GetExports<IRouteRegistrar, IOrderedMetadata>() 
      .OrderBy(r => r.Metadata.Order) 
      .Select(r => r.Value); 

     var routes = RouteTable.Routes; 

     foreach (var registrar in registrars) 
      registrar.RegisterRoutes(routes); 

    } 
    #endregion 
}