суббота, 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:

//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 завершен. Если что-то осталось непонятно - задавайте вопросы, буду стараться разъяснять.


9 коммент.:

  1. Ок, а зачем это нужно? чтобы налету менять метаданные? как часто это приходится делать на практике?

    ОтветитьУдалить
  2. @Артур, нет не для этого.
    Для того, чтобы не заморачиваться с DataAnnotations атрибутами, которые, иногда, предлагают не очевидные и громоздкие решения. Плюсом к этому вы можете всячески структурировать ваши метаданные: наследовать их, выделять общие решения и т.д.

    Следующий пост планирую как-раз посвятить метаданным - конфигурированию и расширению.

    ОтветитьУдалить
  3. АнонимныйAug 20, 2011 04:41 AM

    А клиентская валидация будет работать?
    Просто чуть меньше года назад смотрел FluentValidation.MVC как альтернативу DataAnnotation, то там была реализована клиентская валидация только для Required (может еще для чего-то, уже не помню)

    ОтветитьУдалить
  4. @Анонимный,
    Поддерживается вся стандартная клиентская валидация.

    ОтветитьУдалить
  5. АнонимныйAug 20, 2011 04:55 AM

    Классно! пасибо за участие в разработки это проекта!

    ОтветитьУдалить
  6. Клёвая статья, даже подписался на блог. Только вот одного понять не могу, почему каждый раз при заходе на страницу блога выскакивает окно с предложением ввести пароль и логин для доступа к https://hazzik.googlecode.com/
    Это утомляет. :\

    ОтветитьУдалить
  7. @Dzmuh, там скрипт был, вырезающий верхнюю полосу от блогера, убрал;) Но все-равно странно, у меня с этим проблем не было%(

    ОтветитьУдалить
  8. @hazzik
    Может быть вы не совсем правильно подключали скрипт из репозитория? Посмотрите здесь пример: http://code.google.com/p/html5shiv/

    ОтветитьУдалить
  9. Да и конечно - проблема нынче исчезла.) Спасибо!

    ОтветитьУдалить