3-х уровневая архитектура - нужен пример

PDO не очень хорош с такими вещами. Вам нужно создать строку с вопросительными знаками динамически и вставить в запрос.

$in  = str_repeat('?,', count($in_array) - 1) . '?';
$sql = "SELECT * FROM my_table WHERE my_value IN ($in)";
$stm = $db->prepare($sql);
$stm->execute($in_array);
$data = $stm->fetchAll();

Если в запросе есть другие заполнители, вы можете использовать следующий подход (код берется из моего PDO tutorial ):

Вы можете использовать функцию array_merge(), чтобы объединить все переменные в один массив, добавив другие переменные в виде массивов в том порядке, в каком они появляются в вашем query:

$arr = [1,2,3];
$in  = str_repeat('?,', count($arr) - 1) . '?';
$sql = "SELECT * FROM table WHERE foo=? AND column IN ($in) AND bar=? AND baz=?";
$stm = $db->prepare($sql);
$params = array_merge([$foo], $arr, [$bar, $baz]);
$stm->execute($params);
$data = $stm->fetchAll();

Если вы используете именованные заполнители, код будет немного сложнее, так как вам нужно создать последовательность именных заполнителей, например :id0,:id1,:id2. Таким образом, код будет выглядеть следующим образом:

// other parameters that are going into query
$params = ["foo" => "foo", "bar" => "bar"];

$ids = [1,2,3];
$in = "";
foreach ($ids as $i => $item)
{
    $key = ":id".$i;
    $in .= "$key,";
    $in_params[$key] = $item; // collecting values into key-value array
}
$in = rtrim($in,","); // :id0,:id1,:id2

$sql = "SELECT * FROM table WHERE foo=:foo AND id IN ($in) AND bar=:bar";
$stm = $db->prepare($sql);
$stm->execute(array_merge($params,$in_params)); // just merge two arrays
$data = $stm->fetchAll();

К счастью, для названных заполнителей нам не обязательно следовать строгий порядок, поэтому мы можем объединить наши массивы в любом порядке.

13
задан Paul Turner 6 January 2010 в 08:50
поделиться

7 ответов

[

] Это то, что у меня есть в моем проекте. Больше, чем просто традиционная 3-уровневая архитектура. [

] [

]1.) []Application.Infrastructure[][

] [
    ] [
  • ]Base classes for all businessobjects, business object collection, data-access classes and my custom attributes and utilities as extensions methods, Generic validation framework. Это определяет общую организацию поведения моего конечного .net приложения.[
  • ] [
] [

]2.). []Application.DataModel[][

] [
    ] [
  • ]Typed Dataset for the Database.[
  • ] [
  • ]TableAdapters extended to include Transactions and other features I may need.[
  • ] [
] [

]3.). []Application.DataAccess[][

] [
    ] [
  • ]Data Access классы доступа к данным.[
  • ] [
  • ]Фактическое место, где запрашиваются действия Базы данных с использованием набора типизированных данных.[
  • ] [
] [

]4.). []Application.DomainObjects[][

] [
    ] [
  • ]Business objects and Business objects collection.[
  • ] [
  • ]Enums.[
  • ] [
] [

]5.). []Application.BusinessLayer[][

] [
    ] [
  • ]Предоставляет классы менеджера, доступные с уровня Presentation.[
  • ] [
  • ]HttpHandlers.[
  • ] [
  • ]My own Page base class.[
  • ] [
  • ]More things go here..[
  • ] [
] [

]6.). []Application.WebClient[] или []Application.WindowsClient[][

] [
    ] [
  • ]My presentation layer[
  • ] [
  • ]Takes references from Application.BusinessLayer and Application.BusinessObjects.[
  • ] [
] [

]Application.BusinessObjects are used across the application and they travel across all layers whenever neeed [except Application.DataModel and Application.Infrastructure][

] [

]All my queries are defined only Application.DataModel.[

] [

]Application.DataAccess возвращает или принимает Бизнес-объекты как часть любой операции доступа к данным. Бизнес-объекты создаются с помощью атрибутов отражения. Каждый бизнес-объект помечается отображением атрибута на целевую таблицу в базе данных, а свойства внутри бизнес-объекта помечаются отображением атрибута на целевую колонку в соответствующей таблице базы данных.[

] [

]My validation framework позволяет мне проверять каждое поле с помощью ValidationAttribute.[

] [

]My framrwork интенсивно использует атрибуты для автоматизации большинства утомительных задач, таких как отображение и проверка достоверности. В качестве нового аспекта в фреймворке я могу использовать и новые возможности.[

] [

]Пример бизнес-объекта выглядел бы так в моем приложении.[

] [

][]User.cs[][

] [
[TableMapping("Users")]
public class User : EntityBase
{
    #region Constructor(s)
    public AppUser()
    {
        BookCollection = new BookCollection();
    }
    #endregion

    #region Properties

    #region Default Properties - Direct Field Mapping using DataFieldMappingAttribute

    private System.Int32 _UserId;

    private System.String _FirstName;
    private System.String _LastName;
    private System.String _UserName;
    private System.Boolean _IsActive;

    [DataFieldMapping("UserID")]
    [DataObjectFieldAttribute(true, true, false)]
    [NotNullOrEmpty(Message = "UserID From Users Table Is Required.")]
    public override int Id
    {
        get
        {
            return _UserId;
        }
        set
        {
            _UserId = value;
        }
    }

    [DataFieldMapping("UserName")]
    [Searchable]
    [NotNullOrEmpty(Message = "Username Is Required.")]
    public string UserName
    {
        get
        {
            return _UserName;
        }
        set
        {
            _UserName = value;
        }
    }

    [DataFieldMapping("FirstName")]
    [Searchable]
    public string FirstName
    {
        get
        {
            return _FirstName;
        }
        set
        {
            _FirstName = value;
        }
    }

    [DataFieldMapping("LastName")]
    [Searchable]
    public string LastName
    {
        get
        {
            return _LastName;
        }
        set
        {
            _LastName = value;
        }
    }

    [DataFieldMapping("IsActive")]
    public bool IsActive
    {
        get
        {
            return _IsActive;
        }
        set
        {
            _IsActive = value;
        }
    }

    #region One-To-Many Mappings
    public BookCollection Books { get; set; }

    #endregion

    #region Derived Properties
    public string FullName { get { return this.FirstName + " " + this.LastName; } }

    #endregion

    #endregion

    public override bool Validate()
    {
        bool baseValid = base.Validate();
        bool localValid = Books.Validate();
        return baseValid && localValid;
    }
}
] [

][]BookCollection.cs[][

] [
/// <summary>
/// The BookCollection class is designed to work with lists of instances of Book.
/// </summary>
public class BookCollection : EntityCollectionBase<Book>
{
    /// <summary>
    /// Initializes a new instance of the BookCollection class.
    /// </summary>
    public BookCollection()
    {
    }

    /// <summary>
    /// Initializes a new instance of the BookCollection class.
    /// </summary>
    public BookCollection (IList<Book> initialList)
        : base(initialList)
    {
    }
}
]
15
ответ дан 1 December 2019 в 17:26
поделиться
[

] В Википедии есть хорошее объяснение: []Многоуровневая архитектура[]:[

] [
] [

] 'Трехуровневая' - это архитектура клиент-сервер, в которой пользовательский интерфейс, функциональная логика процесса ("бизнес-правила"), хранение компьютерных данных и доступ к данным разрабатываются и поддерживаются как независимые модули, чаще всего на отдельных платформах.[

] [
] [

][alt text][

] [
] [

][]Использование веб-разработок[][

] [

]В области веб-разработок трехуровневая архитектура часто используется для обозначения веб-сайтов, обычно сайтов электронной коммерции, которые строятся с использованием трех уровней:[

] [
] [
    ] [
  • ]Внешний веб-сервер, обслуживающий статический контент, и потенциально некоторый динамический контент, кэшируемый. [
  • ] [
  • ]Сервер приложений среднего уровня динамической обработки и генерации контента, например, Java EE, ASP.net, PHP-платформа.[
  • ] [
  • ]Внутренняя база данных, включающая как наборы данных, так и систему управления базой данных или программное обеспечение СУБД, управляющее данными и обеспечивающее доступ к ним.[
  • ] [
] [
] [
]
22
ответ дан 1 December 2019 в 17:26
поделиться
[

]3-уровневая архитектура может иметь различные значения в зависимости от контекста. Как правило, это означает, что ответственность в приложении разделена между различными уровнями. Как правило, 3-уровень относится к :[

] [
    ] [
  • ]уровню представления" (фактический пользовательский интерфейс)[
  • ] [
  • ]логическому уровню (приложение/бизнес-логика)[
  • ] [
  • ]уровню данных (база данных, хранилище данных)[
  • ] [
] [

]подробности различаются в зависимости от приложения.[

] [

]Википедия, как обычно, имеет хороший обзор: []http://en.wikipedia.org/wiki/Multitier_architecture[][

] [

]Простой пример - типичное бизнес-приложение:[

] [
    ] [
  • ]представление: браузер или толстый клиент[
  • ] [
  • ]логический уровень: бизнес-логика, обычно в сервере приложений (на основе J2EE, ASP. NET или любой другой)[
  • ] [
  • ]уровень данных: база данных, обычно СУБД, такая как MySQL или Oracle[
  • ] [
]
4
ответ дан 1 December 2019 в 17:26
поделиться
[

] Хорошее учебное пособие, с полным контролем над исходным кодом, можно было бы загрузить хорошо написанное многоуровневое приложение здесь:[

] [

][]http://nerddinnerbook.s3.amazonaws.com/Intro.htm[][

] [

]Это не учебное пособие по многоуровневой архитектуре, но это хорошо написанное приложение, и оно дает некоторое представление о том, почему вы можете рассмотреть эту архитектуру. [

] [

]Кроме того, как уже было вкратце рассмотрено выше, речь идет о разделении кода логики/хранения/представления, так что если вам нужно изменить один из них (например, перейти с фронтальной части asp.net на десктопное приложение), это не так сложно сделать.[

]
0
ответ дан 1 December 2019 в 17:26
поделиться

Под "ярусом" вы подразумеваете "слой" в вашем программном стеке? Слово "уровень" лучше использовать для описания физических компонентов вашей системы. Если вы используете ASP.NET, вероятно, у вас уже есть "трехуровневая" система -

  1. Браузер, отображающий web-страницы
  2. IIS Server, на котором размещено ваше приложение
  3. Database Server с вашей базой данных

Но вы, возможно, помещаете весь ваш код в один программный "слой" - в частности, код за файлом ваших aspx-страниц. Вы хотите перейти с одного уровня на 3 уровня. Классическая программная архитектура "3 уровня" состоит из следующего -

  1. Presentation Layer

  2. Business Logic Layer (BLL)

  3. Data Access Layer (DAL)

alt text
(source: asp.net)

Для типичного приложения ASP.NET, вы можете применить это следующим образом. Во-первых, вы создаете файл LINQ2SQL (.dbml), содержащий объекты для доступа к вашей базе данных. Это ваш Уровень доступа к данным (DAL).

Далее вы можете создать DLL, содержащую ваш Уровень бизнес-логики (BLL). Этот уровень будет иметь доступ к базе данных через DAL, манипулировать ею по мере необходимости, а затем выставлять ее через простой интерфейс. Например, если ваше приложение отображает список клиентов, BLL может иметь публичную функцию GetClientList(), которая возвращает список клиентов.

Наконец, вы должны настроить свой код за файлами, чтобы инстанцировать BLL и подключить его к компонентам интерфейса. Это ваш Презентационный уровень . Например, он может взять данные, возвращенные из вашей функции GetClientList() и привязать их к сетке данных в веб-форме. Идея заключается в том, чтобы сделать презентационный слой как можно более тонким.

Это кажется немного длинноволновым для описания, но это довольно просто после того, как вы сделали это пару раз. Вы обнаружите, что выделение вашего приложения таким образом значительно упростит его обслуживание, так как выделение проблем приводит к более чистому коду. Вы также обнаружите, что гораздо проще обновить или даже заменить ваш презентационный слой, так как он содержит очень мало "умных" элементов. Наконец, вы достигнете точки, когда у вас появится ряд очень полезных BLL-библиотек, которые вы сможете легко использовать в новых приложениях, значительно повышая производительность.

10
ответ дан 1 December 2019 в 17:26
поделиться

Уровень представления : поместите все, что связано с пользовательским интерфейсом. (То, что видит пользователь)

Business layer: все, что связано с логикой приложения (Как обрабатывается информация, поступающая с уровня представления)

Data layer: абстракция источника(ов) данных (Где и как хранится информация, поступающая с/на бизнес-уровень)

Каждый уровень должен знать как можно меньше о другом и это должен быть подход сверху вниз:

  • уровень данных не должен знать ничего о бизнесе, а уровень презентации
  • бизнес должен знать о данных, но не о презентации
  • презентация должна знать о бизнесе, но не о данных

Простой пример:

сайт:

  • презентация: все графические элементы, поля, в которые пользователь вставляет данные, меню, изображения и др.
  • Бизнес: все ограничения в отношении данных (уникальное имя, имя без символов, действительная дата и т.д.), методы манипулирования бизнес-объектами (создание нового пользователя, добавление нового порядка и т.д.)
  • Данные: Методы доступа к основной базе данных.
4
ответ дан 1 December 2019 в 17:26
поделиться

Посмотрите на плитки Apache . Так как вы работаете со Стратсом, я удивлен, что вы не нашли его. По сути, это механизм шаблона, и я думаю, что он соответствует вашим требованиям.

Уже предложенный < jsp: include > можно использовать с < jsp: param > для передачи переменных. Как и

<jsp:include file="includedFile.jsp">
    <jsp:param name="username" value="jsmith" />
</jsp:include>

На самом деле, если бы я хотел включить 1 файл с общим кодом, я бы рекомендовал простоту < jsp: include > над мощностью плитки.

-121--1918261-
  1. Выполните итерацию через все столбцы объекта GridView и сохраните в коллекции .

     Список < DataControlField > столбцы = новый список < DataControlField > ();
    foreach (столбец DataControlField в gv. Столбцы)
    {
    столбцы. Добавить (колонка);
    }
    
  2. Измените значения column-objects по мере необходимости в коллекции.

    //Изменить порядок сбора столбцов.
    
  3. Очистить все столбцы объекта GridView и добавить столбцы из коллекции в объект GridView .

      GV. Колонки. Ясный ();
    foreach (столбец DataControlField в столбцах)
    {
    гв. Columns.Add (столбец);
    }
    
-121--4055903-

Трехуровневая архитектура обычно имеет следующие компоненты:

  1. Клиентский браузер
  2. Веб-сервер, на котором размещено приложение ASP.NET
  3. Некоторые внутренние места хранения, такие как база данных, к которой обращается приложение ASP.NET

Поэтому, чтобы ответить на ваш вопрос о том, как написать код для трехуровневой архитектуры, вы разрабатываете приложение ASP.NET, которое взаимодействует с данными местами хранения

2
ответ дан 1 December 2019 в 17:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: