【问题标题】:How do you create a FubuMVC behavior that copies site configuration values to an output model?如何创建将站点配置值复制到输出模型的 FubuMVC 行为?
【发布时间】:2011-07-04 15:17:36
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: fubumvc


    【解决方案1】:

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

    行为

    我的行为应该是这样的:

    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 中构建约定

    在调用“Routes”之后。在您的 FubuRegistry 中,添加如下一行:

    ApplyConvention<HomeFooterBehaviorConfiguration>();
    

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

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

    【讨论】:

    • IFubuRequest 是我所缺少的,谢谢。连接约定的详细解释也很棒。
    猜你喜欢
    • 2011-05-11
    • 2011-01-30
    • 2017-04-14
    • 2017-03-04
    • 2012-03-25
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    相关资源
    最近更新 更多