Допустим, у меня была выходная модель с именем 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>();
Перекомпилируйте, и она должна работать.
Пожалуйста, дайте мне знать, если у вас возникнут какие-либо проблемы.