2010-12-13 2 views
0

Fondamentalement, comme le titre l'indique lors de l'utilisation de zones dans ASP.NET MVC2.0, je me suis retrouvé avec le suivant "MapRoute "Le code de manipulation est dupliqué pour" RouteCollection "et AreaRegistrationContext" Les deux objets sont en dehors de mon contrôle (c.-à-d. dans le framework .NET MVC), mais ne semblent pas découler d'une interface/classe de base commune. éliminer la duplication de code dans cette situation?Suppression de la duplication de code pour les appels à "RouteCollection.MapRoute()" et "AreaRegistrationContext.MapRoute()"

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); 
      } 
     } 
    } 

Répondre

0

Je ne sais pas si cela aide, mais je suis en fait d'une manière différente avec l'enregistrement d'itinéraire. au lieu d'utiliser les zones de cette façon, en fait je créé une interface IRouteRegistrar WHI ch Je peux créer des registrars pour. Mon exemple est spécifique à MEF, mais il n'y a aucune raison que vous ne pouvez pas utiliser le même mécanisme pour toute autre mise en œuvre 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 
} 

En abstraire l'enregistrement d'itinéraire dans cette interface simple, je trouve beaucoup plus modulaire et testable.

/// <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 
} 
Questions connexes