Bootstrapper tasks
В MvcExtensions для размещения кода, выполняющегося при запуске приложения существует понятие Bootstrapper, которому можно назначать задачи.Назначение задачи происходит следующим образом:
//Global.asax.cs
public class MvcApplication : WindsorMvcApplication
{
public MvcApplication()
{
Bootstrapper.BootstrapperTasks
// задача, для регистрации контроллеров в IoC контейнер.
.Include();
}
}
Кроме стандартной задачи для регистрации контроллеров существует еще несколько стандартных задач, которые подключают дополнительные возможности. Также есть несколько базовых классов, которые позволяют выполняет такие полезные действия, как регистрация маршрутов, фильтров, модел-байндеров, etc.
Регистрация маршрутов
Для регистрации маршрутов вам необходимо унаследоваться от абстрактного класса RegisterRoutesBase, и подключить задачу к bootstrapper.
public class RegisterRoutes : RegisterRoutesBase
{
public RegisterRoutes(RouteCollection routes) : base(routes)
{
}
protected override void Register()
{
Routes.IgnoreRoute("favicon.ico");
Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
Routes.MapRoute("Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional });
}
}
Конфигурация фильтров
Еще одной интересной возможностью MvcExtensions является возможность добавлять фильтры (IMvcFilter) к действиям контроллеров динамически. Этот подход позволяет писать фильтры не через атрибуты, а как обычные классы, при этом появляется возможность использовать инжекцию зависимостей через конструктор. Для регистрации фильтров необходимо унаследоваться от базового абстрактного класса ConfigureFiltersBase.Рассмотрим небольшой пример:
public class ConfigureFilters : ConfigureFiltersBase
{
public ConfigureFilters(IFilterRegistry registry) : base(registry) { }
protected override void Configure()
{
Registry.Register<ProductController, PopulateCategories, PopulateSuppliers>(c => c.Create())
.Register<ProductController, PopulateCategories, PopulateSuppliers>(c => c.Edit(0));
}
}
Как видно из примера, для контроллера ProductController для действий Create и Edit регистрируются два фильтра PopulateCategories и PopulateSuppliers
Регистрация ModelBinder
В жизни бывает всякое и иногда необходимо написать свой ModelBinder, с помощью ConfigureModelBindersBase вы можете привязать свой ModelBinder к модели.public class ConfigureModelBinders : ConfigureModelBindersBase
{
public ConfigureModelBinders(TypeMappingRegistry<object, IModelBinder> registry)
: base(registry) { }
protected override void Configure()
{
Registry.Register<ProductEditModel, ProductEditModelBinder>();
}
}
Здесь вроде все понятно.
Собственные Bootstrapper tasks
Нет ничего проще, чем создать собственные задачи: необходимо просто унаследоваться от базового класса BootstrapperTask. Также задачи могут зависеть от других задач, для этого вашу задачу нужно пометить атрибутом [DependsOn]. И главное: не забудьте зарегистрировать свои задачи в бутстрапер.[DependsOn(typeof(RegisterRoutes))]
public class ConfigureFiltersBase : BootstrapperTask
{
protected override void Configure()
{
// Ваш код будет здесь
}
}
Спасибо за статьи, они сэкономили бы мне пару часов рабочего времени :)
ОтветитьУдалитьВозвращаясь к вопросу о www.dotnetconf.ru, ты выступишь с докладом об этой библиотеке и планах на ее будущее?
1. Ссылка неправильно вставилась www.dotnetconf.ru
ОтветитьУдалить2. hazzik, почему ты не пользуешься ножницами?
Вцелом интересно и информативно, спасибо.
@Артём, не знаю почему;)
ОтветитьУдалитьЛюбопытен fluent-интерфейс для конфигурации метаданных модели. Есть ли "простой способ" попробовать, без использования "всей мощи библиотеки" и перехода на ваш bootstrapper?
ОтветитьУдалитьЭтот комментарий был удален автором.
ОтветитьУдалитьСпасибо за статьи!
ОтветитьУдалитьЯ вроде все сделал, как написано, но не получается ничего заинжектить в контроллеры через конструктор... Инсталлеры созданы, соответствие устанавливается.
В чем проблема может быть?
@hazzik, Примеры реализации кастомной валидации не помешали бы. Хотелось бы увидеть про это в будущих статьях ;)
ОтветитьУдалить