首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建将站点配置值复制到输出模型的FubuMVC行为?

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

Stack Overflow用户
提问于 2011-02-26 05:59:25
回答 1查看 251关注 0票数 1

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

这样,我就不必在每个需要它的操作中复制bool,只需将行为添加到需要该值的控制器操作中即可。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-27 00:09:02

假设我有一个名为HomeViewModel的输出模型,它有一个名为FooterText的属性,我希望从容器(即StructureMap)中检索的设置对象(假设为HomeSettings)中加载该属性。

Behavior

我的行为看起来像这样:

代码语言:javascript
复制
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定义约定,例如:

代码语言:javascript
复制
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中,添加一行如下所示:

代码语言:javascript
复制
ApplyConvention<HomeFooterBehaviorConfiguration>();

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5123186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档