#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 расширяет представление за счет специфичных для клиента функций.