MvcExtensions - это библиотека расширений для ASP.NET MVC. Библиотека предоставляет пользователю мощнейший инструмент для конфигурирования метаданных для ASP.NET MVC посредством fluent-интерфейса. Второй важной особенностью библиотеки является возведение использования IoC контейнера в абсолют (Можно инжектировать данные даже в атрибуты).
С чего начать?
Для начала вам необходимо определится с IoC контейнером, который вы хотите использовать - в MvcExtensions есть адаптеры для следующих популярных IoC контейнеров: Castle.Windsor, Unity, Ninject, StructureMap. Для этого вам необходимо установить соответствующую версию адаптера через nuget: Castle.Windsor, Unity, Ninject, StructureMap.
Затем вам необходимо унаследовать класс своего приложения от базового приложения для выбранного адаптера, например, MvcExtensions.Windsor.WindsorMvcApplication
:
//Global.asax.cs
public class MvcApplication : WindsorMvcApplication {
public MvcApplication() {
}
}
UPD По умолчанию в HttpAppication в качестве бутсраппер-методов создаются методы Application_Start
и Application_End
. MvcExtensions предоставляет альтернативные методы для этого OnStart
и OnEnd
. Необходимо использовать их, иначе код в метода Application_Start
и Application_End
не будет вызван.
Инициализируем 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) {
var registration = Component.For<IAuthenticationService>()
.ImplementedBy<FormsAuthenticationService>()
.LifeStyle.Transient;
container.Register(registration);
}
}
Полученные таким образом классы нужно положить в ваше MVC приложение в любую папку, я рекомендую в /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 {
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 завершен. Если что-то осталось непонятно - задавайте вопросы, буду стараться разъяснять.