С чего начать?
Для начала вам необходимо определится с 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", "Пароль и подвтерждение пароля должны совпадать");
}
}
Ок, а зачем это нужно? чтобы налету менять метаданные? как часто это приходится делать на практике?
ОтветитьУдалить@Артур, нет не для этого.
ОтветитьУдалитьДля того, чтобы не заморачиваться с DataAnnotations атрибутами, которые, иногда, предлагают не очевидные и громоздкие решения. Плюсом к этому вы можете всячески структурировать ваши метаданные: наследовать их, выделять общие решения и т.д.
Следующий пост планирую как-раз посвятить метаданным - конфигурированию и расширению.
А клиентская валидация будет работать?
ОтветитьУдалитьПросто чуть меньше года назад смотрел FluentValidation.MVC как альтернативу DataAnnotation, то там была реализована клиентская валидация только для Required (может еще для чего-то, уже не помню)
@Анонимный,
ОтветитьУдалитьПоддерживается вся стандартная клиентская валидация.
Классно! пасибо за участие в разработки это проекта!
ОтветитьУдалитьКлёвая статья, даже подписался на блог. Только вот одного понять не могу, почему каждый раз при заходе на страницу блога выскакивает окно с предложением ввести пароль и логин для доступа к https://hazzik.googlecode.com/
ОтветитьУдалитьЭто утомляет. :\
@Dzmuh, там скрипт был, вырезающий верхнюю полосу от блогера, убрал;) Но все-равно странно, у меня с этим проблем не было%(
ОтветитьУдалить@hazzik
ОтветитьУдалитьМожет быть вы не совсем правильно подключали скрипт из репозитория? Посмотрите здесь пример: http://code.google.com/p/html5shiv/
Да и конечно - проблема нынче исчезла.) Спасибо!
ОтветитьУдалить