基本上,正如标题所说,在ASP.NET MVC2.0中使用区域时,我最终使用了下面的"MapRoute“来处理"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);
}
}
}发布于 2010-12-13 19:22:06
不确定这是否有帮助,但我实际上使用了一种不同的路由注册方式。我实际上创建了一个可以为其构建订单注册器的接口IRouteRegistrar,而不是以这种方式使用区域。我的示例是特定于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
}https://stackoverflow.com/questions/4427940
复制相似问题