Во-первых, я предполагаю, что вы уже настроили объект (ы) настроек в 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 так, чтобы он делал инъекцию сеттера для объектов настроек (чтобы он автоматически вставлял OutputModelSettings в свойство «Настройки» вашей выходной модели.
Настройка политики внедрения сеттерав вашем коде инициализации StructureMap (Реестр, Глобальный ASAX, ваш Bootstrapper и т. д. - где бы вы ни настраивали свой контейнер).
x.SetAllProperties(s => s.Matching(p => p.Name.EndsWith("Settings")));
Создайте свое поведение, чтобы вызывать "Сборку StructureMap"Up () "на выходной модели, чтобы инициировать впрыск сеттера.Поведение будет открытого типа (то есть в конце), так что оно может поддерживать любую модель вывода
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()))));
}
}
Подключите соглашение в FubuRegistry после раздела Маршруты:
ApplyConvention<OutputModelSettingBehaviorConfiguration>();
На ваш взгляд, используйте новый объект настроек:
<%: Model.Settings.BestSimpsonsCharacter %>
ПРИМЕЧАНИЕ. Я зафиксировал это в качестве рабочего примера в проекте FubuMVC.HelloWorld в источнике Fubu.Смотрите этот коммит: https://github.com/DarthFubuMVC/fubumvc/commit/2e7ea30391eac0053300ec0f6f63136503b16cca