MvcExtensions: bootstrapping

Как я уже писал во введении, весь код, выполняющийся при старте приложения необходимо помещать в, BootstrapperTask.

Bootstrapper tasks

В MvcExtensions для размещения кода, выполняющегося при запуске приложения существует понятие Bootstrapper, которому можно назначать задачи.

Назначение задачи происходит следующим образом:

//Global.asax.cs
public class MvcApplication : WindsorMvcApplication {
    public MvcApplication() {
        Bootstrapper.BootstrapperTasks
            .Include<RegisterControllers>(); // задача, для регистрации контроллеров в IoC контейнер.
        }
    }

Кроме стандартной задачи для регистрации контроллеров существует еще несколько стандартных задач, которые подключают дополнительные возможности. Также есть несколько базовых классов, которые позволяют выполняет такие полезные действия, как регистрация маршрутов, фильтров, модел-байндеров, 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() {
        // Ваш код будет здесь
    }
}

Вместо заключения

На сегодня все. В следующей статье я планирую подробно рассмотреть конфигурацию метаданых.

comments powered by Disqus