Как я могу обеспечить согласованный интерфейс URL-адресов между различными контроллерами в проекте Asp.net MVC?

Интерфейсы в C# отлично подходят для обеспечения того, чтобы методы действий моих контроллеров принимали одинаковое число, тип данных и порядок параметров. К сожалению, это не помогает поддерживать согласованность URL-адресов, сгенерированных механизмом маршрутизации. Как убедиться, что имена параметров совпадают?

Например:

Как мне убедиться, что

sportswear/products

а также

carsandtrucks/products

оба принимают параметр productId?

Я хотел бы попытаться избежать многих маршрутов в global.asax.cs, так как я чувствую, что они не интуитивно понятны, но я открыт для идей.


person Chris McCall    schedule 01.11.2011    source источник
comment
Пожалуйста, приведите пример того, чего вы хотели бы достичь.   -  person counsellorben    schedule 01.11.2011


Ответы (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() && implementationParameters.MoveNext())
                    {
                        Assert.AreEqual(interfaceParameters.Current.Name, implementationParameters.Current.Name);
                    }
                }
            }
        }
    }
}

Надеюсь это поможет.

person Rich O'Kelly    schedule 03.11.2011
comment
Интересный подход. Мог бы увидеть это даже как qunit suite :) - person Chris McCall; 19.10.2012