1

我试图弄清楚创建一个将布尔站点配置值复制到输出模型的行为。

这样,我不必在视图需要它的每个操作中复制 bool,而是可以简单地将行为添加到需要此值的控制器操作中。

在一些旧版本的 FubuMVC 中,我相信行为可能会在输出模型离开控制器后对其进行修改。但我不确定如何在最新版本的 FubuMVC 中执行此操作(或者我已经忘记了)。

谁能给我一个示例或指出将站点配置值复制到输出模型的最佳实践方向?

4

1 回答 1

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从请求中获取(输出模型),然后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>()));
    }
}

这是一个用于演示目的的真正愚蠢的约定。在您的项目中,您可能会使其更通用一点。例如,任何具有属性或实现特定接口等的输出模型。事实上,您可能希望检查所有输出模型以查看它们是否包含任何符合特定条件的属性(例如,所有属性以“设置”结尾——比如“页脚设置”或其他东西)。

由于性能问题,不要害怕定义像这样广泛的约定,因为所有这些约定代码都在启动时运行,而不是在每个请求上运行。

注意“AddAfter”调用和“Wrapper.For”调用。这是关键,因为它将您的行为置于执行控制器操作之后,但在呈现视图之前。

现在您已经定义了您的行为和约定,是时候将它连接到您的 FubuRegistry 中了。

在 FubuRegistry 中连接你的约定

调用“路由”后。在 FubuRegistry 中,添加如下一行:

ApplyConvention<HomeFooterBehaviorConfiguration>();

重新编译,它应该工作。

如果您遇到任何问题,请告诉我。

于 2011-02-26T16:09:02.110 回答