我正在尝试创建一种将布尔型站点配置值复制到输出模型的行为。
这样,我就不必在每个需要它的操作中复制bool,只需将行为添加到需要该值的控制器操作中即可。
在一些旧版本的FubuMVC中,我相信行为可以在输出模型离开控制器之后修改它。但我不确定在较新版本的FubuMVC中如何做到这一点(或者我忘了)。
有没有人能给我举个例子,或者给我指出将站点配置值复制到输出模型的最佳实践的方向?
发布于 2011-02-27 00:09:02
假设我有一个名为HomeViewModel的输出模型,它有一个名为FooterText的属性,我希望从容器(即StructureMap)中检索的设置对象(假设为HomeSettings)中加载该属性。
Behavior
我的行为看起来像这样:
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属性。
注意::我假设您已经将HomeSettings对象连接到容器中(例如,使用FubuMVC中内置的ISettingsProvider内容)。如果你还没有这个,请让我知道,我可以发布一些代码来说明如何做到这一点。
连接会议
要绑定行为,您需要通过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中连接您的会议
在调用“Routes”之后。在您的FubuRegistry中,添加一行如下所示:
ApplyConvention<HomeFooterBehaviorConfiguration>();重新编译,它应该可以工作。
如果你遇到任何问题,请告诉我。
https://stackoverflow.com/questions/5123186
复制相似问题