OpenRasta Framework для компонентного (или составного) веб-приложения - PullRequest
3 голосов
/ 29 апреля 2011

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

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

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

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

1 Ответ

0 голосов
/ 13 марта 2012

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

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

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

Это дает два URI

  • / myapp / clienta / intro
  • / 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
                            }
          };
        }
    }
}

Intro.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>

Intro.ascx

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

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

...Lots more UI stuff

Intro.ascx.cs

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

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

...