如何在行为中找到输出模型类型?

时间:2011-03-01 03:26:13

标签: fubumvc

使用FubuMVC,我不确定最佳方法是确定当前操作的输出模型类型。我看到不同的对象,我可以从中获取当前请求的URL。但这并不能带来非常好的解决方案。

从行为中获取当前操作的输出模型类型的最简单方法是什么?

如果这不是一个好习惯,那么更好的方法是什么?

1 个答案:

答案 0 :(得分:2)

首先,我假设你已经在StructureMap中设置了你的设置对象,并且已经连接了ISettingsProvider的东西。

最好,最简单的方法就是拉动视图中的设置,如下所示:

<%: Get<YourSettingsObject>().SomeSettingProperty %>

如果您坚持将这些作为输出模型的属性,请继续阅读:

假设你有一个像这样的设置对象:

    public class OutputModelSettings
    {
        public string FavoriteAnimalName { get; set; }
        public string BestSimpsonsCharacter { get; set; }
    }

然后你有一个像这样的输出模型:

    public class OutputModelWithSettings
    {
        public string SomeOtherProperty { get; set; }
        public OutputModelSettings Settings { get; set; }
    }

你需要做一些事情:

  1. 连接StructureMap,以便它为Settings对象进行setter注入(因此它会自动将OutputModelSettings注入到输出模型的“Settings”属性中。

    在StructureMap初始化代码中设置setter注入策略(注册表,Global ASAX,您的Bootstrapper等 - 无论您在何处设置容器)。

    x.SetAllProperties(s => s.Matching(p => p.Name.EndsWith("Settings")));
    
  2. 创建行为以在输出模型上调用StructureMap的“BuildUp()”以触发setter注入。行为将是一个开放类型(即在最后),以便它可以支持任何类型的输出模型

    public class OutputModelSettingBehavior<TOutputModel> : BasicBehavior
        where TOutputModel : class
    {
        private readonly IFubuRequest _request;
        private readonly IContainer _container;
    
        public OutputModelSettingBehavior(IFubuRequest request, IContainer container)
            : base(PartialBehavior.Executes)
        {
            _request = request;
            _container = container;
        }
    
        protected override DoNext performInvoke()
        {
            BindSettingsProperties();
    
            return DoNext.Continue;
        }
    
        public void BindSettingsProperties()
        {
            var viewModel = _request.Find<TOutputModel>().First();
            _container.BuildUp(viewModel);
        }
    }
    
  3. 创建一个约定行为的约定

    public class OutputModelSettingBehaviorConfiguration : IConfigurationAction
    {
        public void Configure(BehaviorGraph graph)
        {
            graph.Actions()
                .Where(x => x.HasOutput &&
                            x.OutputType().GetProperties()
                                .Any(p => p.Name.EndsWith("Settings")))
                .Each(x => x.AddAfter(new Wrapper(
                    typeof (OutputModelSettingBehavior<>)
                    .MakeGenericType(x.OutputType()))));
        }
    }
    
  4. 在Routes部分之后将约定连接到您的FubuRegistry:

    ApplyConvention<OutputModelSettingBehaviorConfiguration>();
    
  5. 在您的视图中,使用新的设置对象:

    <%: Model.Settings.BestSimpsonsCharacter %>
    
  6. 注意:我已将此作为Fubu源中FubuMVC.HelloWorld项目的工作样本。请参阅此提交:https://github.com/DarthFubuMVC/fubumvc/commit/2e7ea30391eac0053300ec0f6f63136503b16cca