我正在试图创建一个将布尔站点配置值复制到输出模型的行为。
这样我就不必在每个视图中需要它的动作中复制bool,而只需将行为添加到需要此值的控制器动作中。
在一些旧版本的FubuMVC中,我相信行为可以在输出模型离开控制器后修改它。但是我不知道如何在更新版本的FubuMVC中做到这一点(或者我已经忘记了)。
有人能给我一个例子,或者指出我将网站配置值复制到输出模型的最佳实践方向吗?
答案 0 :(得分:1)
假设我有一个名为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
(输出模型),然后设置{{1输出模型上的属性,基于设置对象的值。
注意:我假设您已将HomeFooterText
对象连接到容器中(例如,使用内置于FubuMVC中的ISettingsProvider内容)。如果您还没有这个,请告诉我,我可以发布一些代码来说明这一点。
布线公约
要连接行为,您需要通过HomeSettings
定义约定,例如:
IConfigurationAction
这是一个用于演示目的的真正愚蠢的惯例。在您的项目中,您可能会使它更通用一些。例如,任何具有属性的输出模型,或实现特定的接口等。实际上,您可能希望检查所有输出模型,以查看它们是否包含任何与某个匹配的属性条件(例如,以“设置”结尾的所有属性 - 如“FooterSettings”或其他内容)。
由于所有这些约定代码在启动时运行而不在每个请求上运行,因此不要害怕因为性能问题而定义这样宽泛的约定。
请注意“AddAfter”调用和“Wrapper.For”调用。这是关键,因为它会在执行控制器操作之后放置行为,但是在呈现视图之前。
现在您已经定义了自己的行为和惯例,现在是时候将它连接到您的FubuRegistry中。
在您的FubuRegistry中布线您的公约
呼叫“路线”后。在你的FubuRegistry中,添加如下这样的一行:
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>()));
}
}
重新编译,它应该可以工作。
如果您遇到任何问题,请告诉我。