Как найти тип выходной модели в поведении? - PullRequest
1 голос
/ 01 марта 2011

С FubuMVC я не уверен, что лучший способ - определить тип выходной модели текущего действия. Я вижу разные объекты, по которым я могу получить URL текущего запроса. Но это не приводит к очень хорошему решению.

Какой самый простой способ получить тип выходной модели текущего действия из поведения?

Если это не очень хорошая практика, что может быть лучше?

1 Ответ

2 голосов
/ 02 марта 2011

Во-первых, я предполагаю, что вы уже настроили объект (ы) настроек в 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 так, чтобы он делал инъекцию сеттера для объектов настроек (чтобы он автоматически вставлял OutputModelSettings в свойство «Настройки» вашей выходной модели.

    Настройка политики внедрения сеттерав вашем коде инициализации StructureMap (Реестр, Глобальный ASAX, ваш Bootstrapper и т. д. - где бы вы ни настраивали свой контейнер).

    x.SetAllProperties(s => s.Matching(p => p.Name.EndsWith("Settings")));
    
  2. Создайте свое поведение, чтобы вызывать "Сборку 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);
        }
    }
    
  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. Подключите соглашение в FubuRegistry после раздела Маршруты:

    ApplyConvention<OutputModelSettingBehaviorConfiguration>();
    
  5. На ваш взгляд, используйте новый объект настроек:

    <%: Model.Settings.BestSimpsonsCharacter %>
    

ПРИМЕЧАНИЕ. Я зафиксировал это в качестве рабочего примера в проекте FubuMVC.HelloWorld в источнике Fubu.Смотрите этот коммит: https://github.com/DarthFubuMVC/fubumvc/commit/2e7ea30391eac0053300ec0f6f63136503b16cca

...