使用FubuMVC,我不确定最佳方法是确定当前操作的输出模型类型。我看到不同的对象,我可以从中获取当前请求的URL。但这并不能带来非常好的解决方案。
从行为中获取当前操作的输出模型类型的最简单方法是什么?
如果这不是一个好习惯,那么更好的方法是什么?
答案 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; }
}
你需要做一些事情:
连接StructureMap,以便它为Settings对象进行setter注入(因此它会自动将OutputModelSettings注入到输出模型的“Settings”属性中。
在StructureMap初始化代码中设置setter注入策略(注册表,Global ASAX,您的Bootstrapper等 - 无论您在何处设置容器)。
x.SetAllProperties(s => s.Matching(p => p.Name.EndsWith("Settings")));
创建行为以在输出模型上调用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);
}
}
创建一个约定行为的约定
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()))));
}
}
在Routes部分之后将约定连接到您的FubuRegistry:
ApplyConvention<OutputModelSettingBehaviorConfiguration>();
在您的视图中,使用新的设置对象:
<%: Model.Settings.BestSimpsonsCharacter %>
注意:我已将此作为Fubu源中FubuMVC.HelloWorld项目的工作样本。请参阅此提交:https://github.com/DarthFubuMVC/fubumvc/commit/2e7ea30391eac0053300ec0f6f63136503b16cca