Как мога да осигуря последователен 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 пакет :) - person Chris McCall; 19.10.2012