如何创建将站点配置值复制到输出模型的FubuMVC行为?

时间:2011-02-25 21:59:25

标签: fubumvc

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

这样我就不必在每个视图中需要它的动作中复制bool,而只需将行为添加到需要此值的控制器动作中。

在一些旧版本的FubuMVC中,我相信行为可以在输出模型离开控制器后修改它。但是我不知道如何在更新版本的FubuMVC中做到这一点(或者我已经忘记了)。

有人能给我一个例子,或者指出我将网站配置值复制到输出模型的最佳实践方向吗?

1 个答案:

答案 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>()));
    }
}

重新编译,它应该可以工作。

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