Платформа OpenRasta для компонентного (или составного) веб-приложения

#components #composite #openrasta

#Компоненты #композитный #openrasta

Вопрос:

мы пытаемся создать более слабо связанное веб-приложение на основе композитов и рассматриваем различные варианты и фреймворки.

Идея заключается в том, что когда пользователь переходит на страницу, uri будет разрешен на сервере для ресурса и списка действий, которые необходимо выполнить, на основе конфигурации.

Представление будет состоять из некоторых разметок html и некоторых компонентов, которые основаны на других URI для их содержимого. Компоненты могут использоваться повторно и не должны иметь никаких представлений друг о друге (возможно, о контексте).

это всего лишь идея, и я хочу посмотреть, как платформа OpenRasta поможет в этом. Возможно, я совершенно не прав в подходе; возможно, это можно легко сделать с помощью текущего asp.net веб-форма и mvc-фреймворк, но я хотел бы узнать ваше мнение.

Ответ №1:

Я только что завершил работу над сайтом OpenRasta, который полагается на стандартные webcontrols, которые я внедряю в свои представления, передавая строго типизированный ресурс (предоставляемый обработчиком ИЛИ через него), чтобы включить управление свойствами поверхностного ресурса и т.д. Обычным способом.

Экземпляр ресурса содержит путь к элементу управления, который необходимо загрузить и внедрить (Resource.ControlPath). Это устанавливается в обработчике путем объединения аспектов URI для поиска элемента управления. Это позволяет разным URI запрашивать разные версии одного и того же элемента управления, которые находятся в разных местах в файловой иерархии сайта.

Так, например, ClientA требует вводного представления с большим количеством текста и функций, специфичных для конкретного клиента. Для ClientB также требуется вводная страница с другим контентом и функциями.

Это дает два URI

  • /myapp / клиент /введение
  • /myapp/clientb/вступление

Конфигурация

 ResourceSpace.Has.ResourcesOfType<IntroResource>()
        .AtUri("/myapp/{client}/intro")
        .HandledBy<IntroHandler>()
        .RenderedByAspx("~/Views/IntroView.aspx");
  

IntroHandler.cs

 public class IntroHandler
{
    public OperationResult Get(string client)
    {
        var controlPath = ClientService.GetIntroControlPath(client);
        if (controlPath.IsEmpty()) return new OperationResult.NotFound();
        return new OperationResult.OK{
             ResponseResource = new IntroResource{
                              ControlPath = controlPath,
                              Client=client
                            }
          };
        }
    }
}
  

Введение.aspx

 <%@ Page Language="C#" Inherits="OpenRasta.Codecs.WebForms.ResourceView<xx.IntroResource>" MasterPageFile="~/Views/View.Master" %>

<asp:Content ContentPlaceHolderID="head" ID="head" runat="server">
    <link href="/assets/CSS/intro.css" rel="stylesheet" type="text/css" />
    <%
        var userControl = Page.LoadControl(Resource.ControlPath) as UserControl;
        if (userControl == null) return;

        var property = userControl.GetType().GetProperty("Resource");
        if (property == null) return;

        property.SetValue(userControl, Resource, null);
        IntroContentControlHolder.Controls.Add(userControl);
    %>
</asp:Content>
<asp:Content ContentPlaceHolderID="body" ID="content" runat="server">
    <asp:placeholder runat="server" id="IntroContentControlHolder"></asp:placeholder>
</asp:Content>
  

Введение.ascx

 <%@ Control CodeBehind="intro.ascx.cs" Language="C#" Inherits="xxxx.intro"%>

 <h1>Welcome <%=Resource.Client%></h1> 

...Lots more UI stuff
  

Введение.ascx.cs

 public class intro : UserControl
{
    public IntroResource Resource { get; set; }
}
  

Поэтому каждая версия элемента управления intro расширяет представление за счет специфичных для клиента функций.