Я разрабатываю API MVC в отдельной библиотеке классов. Методы API используют маршрутизацию атрибутов. API будет использоваться другими приложениями MVC (не построенными мной).Динамический префикс маршрута для контроллеров в отдельной библиотеке
Основное приложение MVC будет ссылаться на мою сборку библиотеки и называть AddMvc()
/UseMvc()
в своем собственном классе запуска. Он сможет динамически устанавливать URL-адрес корневого API-интерфейса для моей библиотеки API (из делегата настройки конфигурации или параметров), чтобы он мог убедиться, что нет конфликтов с его собственными маршрутами, которые могут использовать либо маршрутизацию атрибутов, либо централизованную маршрутизацию.
Итак, скажем, моя библиотека API имеет маршрут product/{id}
. Основное приложение должно иметь возможность выбрать любой префикс маршрута, например api/product/{id}
или some/other/prefix/product/{id}
.
При запуске MVC обнаружит все контроллеры/маршруты во всех ссылочных сборках, а также обнаружит и зарегистрирует маршруты моей библиотеки API, но только на жестко закодированном маршруте product/{id}
без какого-либо префикса.
Я пытался получить MVC для регистрации маршрутов с помощью префикса, но пока ничего не добился. Основное приложение будет вызывать пользовательские методы конфигурации AddMyApi()
/UseMyApi()
, поэтому я могу выполнить настройку/настройку для своей библиотеки. Некоторые из вещей, которые я пробовал:
Mapping
app.Map("/custom-prefix", api =>
{
api.UseMvc();
});
Это приведет к дублированию маршрутов как для custom-prefix/product/{id}
и product/{id}
.
Конвенция Маршрут
основе http://www.strathweb.com/2016/06/global-route-prefix-with-asp-net-core-mvc-revisited/
services.AddMvc(options =>
{
options.Conventions.Insert(0, new RouteConvention(new RouteAttribute("custom-prefix")));
});
Похоже, что это не будет работать, так как параметры будут перезаписаны вызова основного приложения к AddMvc()
, или наоборот, в зависимости который сначала называют.
Пользовательского маршрут атрибут
Пользовательский атрибут маршрута на основе IRouteTemplateProvider
на классах контроллера не будет работать, потому что мне нужна префикс впрыскивается из класса параметров и атрибуты не поддерживают внедрение конструктора.
Откладывать открытие маршрутов
Основываясь на http://www.strathweb.com/2015/04/asp-net-mvc-6-discovers-controllers/
Я добавил [NonController]
к контроллерам библиотеки, чтобы предотвратить их обнаружили при запуске основного приложения. Однако я не смог добавить их позже, и я полагаю, что я столкнусь с той же проблемой, что и основное приложение, перезаписывающее параметры MVC.
Области
Я не могу использовать области, поскольку основное приложение может решить запустить API из корня (без префикса).
Так что я застрял в том, как решить эту проблему. Любая помощь приветствуется.
Спасибо, я смог использовать ваше решение. Вместо метода AddMyLibrary() я устанавливаю условное обозначение префикса в производном классе IConfigureOptions, поэтому мне не нужно будет просить пользователя добавить services.AddMvc(). AddMyLibrary(). Единственный способ, которым пользователь может сломать это, если он впоследствии очистит коллекцию конвенций. –
Carvellis