hazzik's technoblog
понедельник, 10 октября 2011 г.
среда, 24 августа 2011 г.
MvcExtensions: bootstrapping
Как я уже писал во введении, весь код, выполняющийся при старте приложения необходимо помещать в, BootstrapperTask.
Назначение задачи происходит следующим образом:
Кроме стандартной задачи для регистрации контроллеров существует еще несколько стандартных задач, которые подключают дополнительные возможности. Также есть несколько базовых классов, которые позволяют выполняет такие полезные действия, как регистрация маршрутов, фильтров, модел-байндеров, etc.
Для регистрации маршрутов вам необходимо унаследоваться от абстрактного класса RegisterRoutesBase, и подключить задачу к bootstrapper.
Рассмотрим небольшой пример:
Как видно из примера, для контроллера ProductController для действий Create и Edit регистрируются два фильтра PopulateCategories и PopulateSuppliers
Здесь вроде все понятно.
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()
{
// Ваш код будет здесь
}
}
Вместо заключения
На сегодня все. В следующей статье я планирую подробно рассмотреть конфигурацию метаданых.суббота, 20 августа 2011 г.
MvcExtensions: введение
MvcExtensions - это библиотека расширений для ASP.NET MVC. Библиотека предоставляет пользователю мощнейший инструмент для конфигурирования метаданных для ASP.NET MVC посредством fluent-интерфейса. Второй важной особенностью библиотеки является возведение использования IoC контейнера в абсолют (Можно инжектировать данные даже в атрибуты).
Для начала вам необходимо определится с IoC контейнером, который вы хотите использовать - в MvcExtensions есть адаптеры для следующих популярных IoC контейнеров: Castle.Windsor, Unity, Ninject, StructureMap. Для этого вам необходимо установить соответствующую версию адаптера через nuget: Castle.Windsor, Unity, Ninject, StructureMap.
Затем вам необходимо унаследовать класс своего приложения от базового приложения для выбранного адаптера, например, MvcExtensions.WindsorMvcApplication:
Полученные таким образом классы нужно положить в ваше MVC приложение в любую папку, я рекомендую в <YourMvcApplication>/Infrastructure. Необходимо запомнить, что контроллеры таким образом инициализировать не требуется!.
В MvcExtensions весь код, выполняющийся при старте приложения необходимо помещать в, так называемые, BootstrapperTask. Существуют некоторые стандартные таски, такие как например регистрация контроллеров. Для того, чтобы проинструктировать MvcExtensions, что вы хотите зарегистрировать свои контроллеры, необходимо всего-лишь включить задачу RegisterControllers в последовательность задач, выполняемых при старте:
После этого все контроллеры в вашем MVC приложении будут создаваться с помощью IoC контейнера.
Для того, чтобы использовать эту возможность в MvcExtensions необходимо также зарегистрировать ее:
Затем необходимо написать конфигурацию для ваших форм и моделей отображения:
С чего начать?
Для начала вам необходимо определится с IoC контейнером, который вы хотите использовать - в MvcExtensions есть адаптеры для следующих популярных IoC контейнеров: Castle.Windsor, Unity, Ninject, StructureMap. Для этого вам необходимо установить соответствующую версию адаптера через nuget: Castle.Windsor, Unity, Ninject, StructureMap.
Затем вам необходимо унаследовать класс своего приложения от базового приложения для выбранного адаптера, например, MvcExtensions.WindsorMvcApplication:
//Global.asax.cs
public class MvcApplication : WindsorMvcApplication
{
public MvcApplication()
{
}
}
Инициализируем IoC контейнер
Для инициализации вашего любимого IoC контейнера вам необходимо просто реализовать соответствующий интерфейс или унаследоваться от базового класса: IWindsorInstaller, Ninject.Modules.NinjectModule, StructureMap.Configuration.DSL.Registry, Microsoft.Practices.Unity.IModule. Например для Windosor:public class AccountInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component.For<IAuthenticationService>().ImplementedBy<FormsAuthenticationService>().LifeStyle.Transient);
}
}
Полученные таким образом классы нужно положить в ваше MVC приложение в любую папку, я рекомендую в <YourMvcApplication>/Infrastructure. Необходимо запомнить, что контроллеры таким образом инициализировать не требуется!.
Регистрация контроллеров
В MvcExtensions весь код, выполняющийся при старте приложения необходимо помещать в, так называемые, BootstrapperTask. Существуют некоторые стандартные таски, такие как например регистрация контроллеров. Для того, чтобы проинструктировать MvcExtensions, что вы хотите зарегистрировать свои контроллеры, необходимо всего-лишь включить задачу RegisterControllers в последовательность задач, выполняемых при старте:
//Global.asax.cs
public class MvcApplication : WindsorMvcApplication
{
public MvcApplication()
{
Bootstrapper.BootstrapperTasks
.Include<RegisterControllers>();
}
}
После этого все контроллеры в вашем MVC приложении будут создаваться с помощью IoC контейнера.
Метаданные
MvcExtensions предлагает пользователям замену стандартному способу конфигурирования метеданных через DataAnnotations, посредством fluent-интерфейса для конфигурирования. Этот подход обладает феноменальной гибкостью и неограниченными возможностями для расширения.Для того, чтобы использовать эту возможность в MvcExtensions необходимо также зарегистрировать ее:
//Global.asax.cs
public class MvcApplication : WindsorMvcApplication
{
public MvcApplication()
{
Bootstrapper.BootstrapperTasks
.Include<RegisterControllers>()
.Include<RegisterModelMetadata>();
}
}
Затем необходимо написать конфигурацию для ваших форм и моделей отображения:
public class SignUpMetadata : ModelMetadataConfiguration<SignUp>
{
public SignUpMetadata()
{
Configure(x => x.Login)
.DisplayName("Имя пользователя")
.Required("Необходимо указать имя пользователя");
Configure(x => x.Email)
.DisplayName("Адрес электронной почты")
.Required("Необходимоуказать адрес электронной почты")
.AsEmail();
Configure(x => x.Password)
.DisplayName("Пароль")
.Required("Необходимо указать пароль")
.MinimumLength(6, " Длина пароля должна быть не меньше 6 символов")
.AsPassword();
Configure(x => x.ConfirmPassword)
.DisplayName("Пароль еще раз")
.Required("Необходимо указать подтверждение пароля")
.AsPassword()
.Compare("Password", "Пароль и подвтерждение пароля должны совпадать");
}
}
Заключение
На этом первый этап конфигурирования MvcExtensions завершен. Если что-то осталось непонятно - задавайте вопросы, буду стараться разъяснять.воскресенье, 23 мая 2010 г.
Бизнес-правила в DDD-2
Продолжу мучить сообщество своими вопросами по DDD дальше.
Допустим, мы хотим добавить в систему идентификацию не только по адресу электронной почты, но и по имени пользователя. В связи с этим у нас в системе возникает другое бизнес-правило:
Имя пользователя является уникальным
Это бизнес правило фигурирует в следующих историях использования:
Где должна находиться реализация данного бизнес-правила?
Жду ваших ответов с примерами кода в комментариях.
Допустим, мы хотим добавить в систему идентификацию не только по адресу электронной почты, но и по имени пользователя. В связи с этим у нас в системе возникает другое бизнес-правило:
Имя пользователя является уникальным
Это бизнес правило фигурирует в следующих историях использования:
- Пользователь регистрируется в системе, если уже есть другой пользователь с таким именем, то пользователю выводиться сообщение об ошибке.
- Пользователь может изменить свое имя, если уже есть другой пользователь с таким именем, то пользователю выводиться сообщение об ошибке.
Где должна находиться реализация данного бизнес-правила?
Жду ваших ответов с примерами кода в комментариях.
суббота, 22 мая 2010 г.
Бизнес-правила в DDD
У нас в системе есть одно очень интересное и достаточно распространенное бизнес-правило:
Адрес электронной почты пользователя должен быть уникальным в пределах системы.
Где должна находиться реализация данного бизнес-правила?
Жду ваших ответов с примерами кода в комментариях.
Адрес электронной почты пользователя должен быть уникальным в пределах системы.
public class User : IEntity
{
public int Id { get; set; }
public string Email { get; set; }
public string Name { get; set; }
}
Где должна находиться реализация данного бизнес-правила?
Жду ваших ответов с примерами кода в комментариях.
воскресенье, 24 января 2010 г.
PHP во вселенной .NET
Привет, сегодня я хочу рассказать о замечательном проекте Phalanger, который позволил прийти языку программирования PHP во вселенную .NET – и это не шутка! Phalanger – это компилятор PHP в IL-код.
пятница, 22 января 2010 г.
Subversion vs. Git
Привет, сегодня я хочу поговорить о двух, по моему мнению, самых успешных системах контроля версий Subversion и Git. В своей практике я сталкивался с множеством VCS, включая такие экзотические системы как Jedi VCS. Мой личный путь миграции можно кратко описать так: CVS -> SVN -> Git.
Подписаться на:
Сообщения (Atom)