Этот пакет возник из-за необходимости разработки модульного веб-API.
Asp.Net Core с помощью частей приложения позволяет вам модульно структурировать код и легко агрегировать его в хост-приложении.
Поддержка маршрутизации, напротив, слишком хостовая.
Areas предоставляют некоторую поддержку, но их нельзя смешивать с аннотированной маршрутизацией, которая является факультативным способом определения маршрутизации WebApi.
Этот пакет призван восполнить этот пробел.
Даже если он в лучшем случае покажет свою полезность в сочетании с модульной разработкой приложений, вы также можете использовать его как альтернативный способ поддерживать конфигурацию маршрутизации в модульном стиле.
Клонируйте, удалите или используйте Nuget этот пакет в своем решении.
Идентификатор артефактов Nuget: MrBogomips.AspNetMvc.ModuleRouting
.
Здесь вы сопоставляете модули с шаблонами маршрутов.
using MrBogomips.AspNetMvc.ModuleRouting;
...
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// ...
app.UseMvc(routes =>
{
routes.MapModuleRoute("Sample.MvcModuleA", "moduleA"); // Here's the fun!
routes.MapModuleRoute("Sample.MvcModuleB", "moduleB");
});
}
Внутри вашего контроллера вы просто украшаете его:
using MrBogomips.AspNetMvc.ModuleRouting;
namespace Sample.MvcModuleA
{
[RouteModule("Sample.MvcModuleA")]
public abstract class ModuleBaseController: ControllerBase {}
// BEST Practice: use a common module controller base class
// to achieve a better consistency and manteinability
public class ModuleController: ModuleBaseController
{
[HttpGet("hello")]
public string Hello() => "Hello from module A";
}
}
и вуаля…
Напомним, что вы просто используете синтаксис шаблона маршрутизации MVC, поэтому вы можете использовать любой строковый шаблон, который имеет смысл для Asp.Net MVC. Например:
[RouteModule("ModuleName")]
: просто определите зависимость маршрутизации модуля.[RouteModule("ModuleName", "custom/segment")]
: custom/segnment
будет добавлен к шаблону маршрутизации модуля.[RouteModule("ModuleName", "[controller]")]
: имя контроллера будет добавлено к шаблону маршрутизации модуля.[RouteModule("ModuleName", "[action]")]
: имя действия будет добавлено к шаблону маршрутизации модуля. ... для сложной и широкой организации Web Api:
Controller
, украшенный одним из атрибутов RoutModule
AddApplicationPart(…)
MapModuleRoute(…)
namespace My.Module.Namespace {
[RouteModule(ModuleBaseController.ModuleName)]
public abstract class ModuleBaseController: BaseController
{
public const string ModuleName = "My.Module.Namespace";
}
}
Производные контроллеры также могут настраивать свою маршрутизацию в более портативном виде.
[RouteModule(ModuleBaseController.ModuleName, "some/different/admin/path")]
public class AdminController: ModuleBaseController
{
}
Следовательно, маршрутизация может быть реализована более строго, поскольку
app.UseMvc(routes =>
{
//...
routes.MapModuleRoute(My.Module.Namespace.ModuleBaseController.ModuleName, "my/module/path");
//...
}
Справочное приложение можно найти в образце приложения этого проекта.