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