Как создать поведение FubuMVC, которое копирует значения конфигурации сайта в выходную модель? - PullRequest
1 голос
/ 26 февраля 2011

Я пытаюсь создать поведение, которое будет копировать значение конфигурации логического сайта в выходную модель.

Таким образом, мне не нужно копировать bool в каждом действии, для которого требуется представление.это, но может просто добавить поведение к действиям контроллера, которым нужно это значение.

В некоторых из более старых версий FubuMVC я считаю, что поведение может изменить модель вывода после того, как он покинул контроллер.Но я не уверен, как это сделать в более поздних версиях FubuMVC (или я забыл).

Может ли кто-нибудь дать мне пример или укажет мне направление в направлении наилучшей практики копированиязначение конфигурации сайта для выходной модели?

1 Ответ

1 голос
/ 26 февраля 2011

Допустим, у меня была выходная модель с именем HomeViewModel, у которой было свойство с именем FooterText, которое я хотел загрузить из объекта настроек (скажем, HomeSettings), который был извлечен из контейнера (т.е. StructureMap).

Поведение

Мое поведение будет выглядеть примерно так:

public class HomeFooterBehavior : BasicBehavior
{
    private readonly HomeSettings _settings;
    private readonly IFubuRequest _request;

    public HomeFooterBehavior(HomeSettings settings, IFubuRequest request)
        : base(PartialBehavior.Executes)
    {
        _settings = settings;
        _request = request;
    }

    protected override DoNext performInvoke()
    {
        SetupFooter();

        return DoNext.Continue;
    }

    public void SetupFooter()
    {
        var viewModel = _request.Find<HomeViewModel>().First();

        viewModel.HomeFooterText = _settings.FooterText;
    }
}

Это поведение принимает объект HomeSettings и IFubuRequest объект (обе введенные зависимости), а затем получает HomeViewModel (модель вывода) из запроса и затем устанавливает свойство HomeFooterText в модели вывода на основе значения из объекта настроек.

NOTE : Я предполагаю, что у вас уже есть объект HomeSettings, подключенный в контейнере (например, с использованием ISettingsProvider, встроенного в FubuMVC).Если у вас этого еще нет, дайте мне знать, и я могу опубликовать некоторый код о том, как это сделать.

Подключение Конвенции

Чтобы подключитьповедения, вам нужно определить соглашение с помощью IConfigurationAction, например:

public class HomeFooterBehaviorConfiguration : IConfigurationAction
{
    public void Configure(BehaviorGraph graph)
    {
        graph.Actions()
            .Where(x => x.HasOutput && 
                        x.OutputType().Equals(typeof(HomeViewModel)))
            .Each(x => x.AddAfter(Wrapper.For<HomeFooterBehavior>()));
    }
}

Это реальное глупое соглашение для демонстрационных целей.В вашем проекте вы можете сделать его немного более общим.Например, любая выходная модель, которая имеет атрибут или реализует определенный интерфейс и т. Д. Фактически, вы можете проверить все выходные модели, чтобы увидеть, содержат ли они какие-либо свойства, которые соответствуют определенным критериям.(например, все свойства, оканчивающиеся на «Настройки» - например, «FooterSettings» или что-то в этом роде).

Не бойтесь определять такие широкие соглашения о развертывании из-за проблем с производительностью, поскольку весь код этого соглашения выполняется навремя запуска и не по каждому запросу.

Обратите внимание на вызов AddAfter и вызов Wrapper.For.Это ключ к тому, что оно определяет ваше поведение после действия контроллера, но перед отображением представления.

Теперь, когда вы определили свое поведение и свое соглашение, пришло время подключитьсяэто в вашей FubuRegistry.

Подключение вашей конвенции в вашей FubuRegistry

После вызова «Маршруты».в вашей FubuRegistry добавьте строку, подобную этой:

ApplyConvention<HomeFooterBehaviorConfiguration>();

Перекомпилируйте, и она должна работать.

Пожалуйста, дайте мне знать, если у вас возникнут какие-либо проблемы.

...