#asp.net-mvc-3 #c#-4.0 #url-routing
#asp.net-mvc-3 #c #-4.0 #url-маршрутизация
Вопрос:
Интерфейсы на C # отлично подходят для обеспечения того, чтобы методы действий моих контроллеров принимали одинаковое количество, тип данных и порядок параметров. К сожалению, это не помогает поддерживать согласованность URL-адресов, генерируемых механизмом маршрутизации. Как я могу гарантировать, что имена параметров совпадают?
Например:
Как мне убедиться, что
sportswear/products
и
carsandtrucks/products
оба принимают параметр productId
?
Я хотел бы попытаться избежать множества маршрутов в global.asax.cs, поскольку я чувствую, что они не интуитивно понятны, но я открыт для идей.
Комментарии:
1. Пожалуйста, приведите пример того, чего вы хотели бы достичь.
Ответ №1:
Я бы предположил, что лучшим вариантом будет модульный тест, который находит все реализации ваших интерфейсов контроллера и гарантирует, что имена параметров реализации совпадают с именами в интерфейсе.
Итак, что-то вроде
public interface IController
{
ActionResult GetProducts(string productId);
}
[TestFixture]
public class IControllerTest
{
[Test]
public void EnsureImplementationsUseCorrectParameterNames()
{
// Assuming all required assemblies have been loaded
var implementations = AppDomain.CurrentDomain.GetAssemblies().SelectMany(assembly => assembly.GetTypes().Where(type => typeof(IController).IsAssignableFrom(type)));
var interfaceMethods = typeof(IController).GetMethods().ToList();
foreach (var implementation in implementations)
{
var methodPairs = interfaceMethods.Join(implementation.GetMethods(), mi => mi.ToString(), mi => mi.ToString(), (inner, outer) => new { InterfaceMethod = inner, ImplementationMethod = outer });
foreach (var methodPair in methodPairs)
{
using (var interfaceParameters = methodPair.InterfaceMethod.GetParameters().Cast<ParameterInfo>().GetEnumerator())
using (var implementationParameters = methodPair.ImplementationMethod.GetParameters().Cast<ParameterInfo>().GetEnumerator())
{
while (interfaceParameters.MoveNext() amp;amp; implementationParameters.MoveNext())
{
Assert.AreEqual(interfaceParameters.Current.Name, implementationParameters.Current.Name);
}
}
}
}
}
}
Надеюсь, это поможет.
Комментарии:
1. Интересный подход. Можно было бы увидеть это даже как набор qunit 🙂