WebApp.Start <TStartup> Тип параметра метода

При настройке моего приложения Windows Service на собственный хост с использованием Owin на основе этой статьи:

http://www.asp.net/web-api/overview/hosting-aspnet-web-api/use-owin-to-self-host-web-api

Я использовал эту перегрузку метода WebApp.Start:

Метод WebApp.Start(String)

Вот мой код:

//(in startup method) 
_server = WebApp.Start<Startup>(BaseAddress);

public class Startup
{
    // This code configures Web API. The Startup class is specified as a type
    // parameter in the WebApp.Start method.
    public void Configuration(IAppBuilder appBuilder)
    {
        // Configure Web API for self-host. 
        var config = new HttpConfiguration();
        config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new
        {
            id = RouteParameter.Optional
        });

        appBuilder.UseWebApi(config);
    }
} 

Он отлично работает, поэтому никаких претензий нет.

Но каковы же требования параметра типа метода Start? У него нет никаких ограничений, и я не смог найти документацию о том, что мои параметры/требования относятся к этому параметру. Он ищет методы, которые принимают IAppBuilder в качестве параметра? Что делать, если я изменил имя метода Configuration() на что-то еще? Что делать, если я сделаю метод внутренним? Существуют ли другие параметры, которые я могу настроить с помощью этого класса?

Где все это документировано? Я чувствую, что без статьи, приведенной выше, я никогда бы не смог понять, что реализовать.

Ответ 1

Класс WebApp использует отражение для получения указателя на метод Configuration(IAppBuilder), а затем вызывает его. Если класс, который вы предоставляете в качестве аргумента общего типа, не имеет метода Configuration с ожидаемыми аргументами, тогда вы получите сообщение об ошибке во время выполнения.

Я согласен с тем, что это не так легко обнаружить, как хотелось бы, и я не уверен, почему оригинальные разработчики реализовали его таким образом, а не вместо этого добавили ограничение where T: IStartup. Это не только сделает его более доступным для просмотра без документации, но также позволит компилятору проверить это во время компиляции.

Единственное преимущество этого подхода заключается в том, что разработчики OWIN могут добавлять в будущем больше методов или методов с разными сигнатурами без нарушения существующего кода.

Ответ 2

Согласитесь с вашими парнями. Как первокурсник Оуин, здесь трудно понять отражение. Потому что мне трудно найти документы, которые описывают отражение. Использование определения интерфейса для нас легко понять.