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

#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 🙂