0

У меня есть приложение ASP.NET для создания статистики ошибок в процессе производства. Я начал делать это слоями: презентация, бизнес-логика, доступ к даннымЯвляется ли это хорошим способом разделения слоев в приложении ASP.NET?

Я создал простой проект для описания вопроса.

Образец базы данных заключается в следующем:

enter image description here

В моем слое доступа к данным я DAO шаблон, как классы

Например классы ProductDao и ProductDto в моих данных Acces слой является этим:

namespace CustomerSupplierDAL.Dao 
{ 
    public class ProductDao 
    { 
     public void Insert(ProductDto product) 
     { ... } 

     public void Update(ProductDto product) 
     { ... } 

     public void Delete(Guid id) 
     { ... } 

     public void DeleteAllBySupplier(Guid supplier) 
     { ... } 

     public ProductDto Select(Guid id) 
     { ... } 

     public List<ProductDto> SelectAll() 
     { ... } 

     public List<ProductDto> SelectAllBySupplier(Guid supplier) 
     { ... } 
    } 
} 

И объект передачи данных:

namespace CustomerSupplierDAL 
{ 
    public class ProductDto 
    { 
     #region Constructors 

     public ProductDto() 
     { 
     } 

     public ProductDto(Guid id, string description, int price, Guid supplier) 
     { ... } 

     #endregion 

     #region Properties 

     public Guid Id { get; set; } 

     public string Description { get; set; } 

     public int Price { get; set; } 

     public Guid Supplier { get; set; } 

     #endregion 
    } 
} 

Эти методы просто вызывают хранимые процедуры. Например, это для public ProductDto Select(Guid id)

create procedure [dbo].[ProductSelect] 
(
    @Id uniqueidentifier 
) 

as 

set nocount on 

select [Id], 
    [Description], 
    [Price], 
    [Supplier] 
from [Product] 
where [Id] = @Id 

Я создал это для всех моих таблиц в базе данных.

Мои классы бизнес-логики имеют экземпляр нужного класса Dto и используют Daos для взаимодействия с базой данных. Свойства класса BLL возвращаются с помощью свойств Dtos.

Пример:

namespace CustomerSupplierBLL 
{ 
    [DataObject(true)] 
    public class Product 
    { 
     private ProductDto pDto; 
     private ProductDao pDao; 
     private Supplier supplier; 

     public Product(Guid id) 
     { 
      this.pDto = pDao.Select(id); 
      supplier = null; 
     } 

     #region Properties 

     public Guid Id 
     { 
      get { return this.pDto.Id; } 
     } 

     public Guid Supplier 
     { 
      get { return this.pDto.Supplier; } 
     } 

     #region Related Objects 

     public Supplier SupplierInstance 
     { 
      get 
      { 
       if (this.Supplier == null) 
       { 
        this.supplier = new Supplier(this.Supplier); 
       } 

       return this.supplier; 
      } 
     } 

     #endregion 

     #endregion 

     [DataObjectMethod(DataObjectMethodType.Select, false)] 
     public List<ProductDto> GetProducts(Guid supplierId) 
     { 
      return this.pDao.SelectAllBySupplier(supplierId); 
     } 

    } 
} 

В слой представления я использовал ASP.NET Web Forms рамки.

Чтобы отобразить Prodcuts, например, я использую GridView и ObjectDataSource:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
    DataSourceID="ProductsObjectDataSource"> 
    <Columns> 
     <asp:BoundField DataField="Id" HeaderText="Id" SortExpression="Id" /> 
     <asp:BoundField DataField="Description" HeaderText="Description" 
      SortExpression="Description" /> 
     <asp:BoundField DataField="Price" HeaderText="Price" SortExpression="Price" /> 
     <asp:BoundField DataField="Supplier" HeaderText="Supplier" 
      SortExpression="Supplier" /> 
    </Columns> 
</asp:GridView> 

<asp:ObjectDataSource ID="ProductsObjectDataSource" runat="server" 
    OldValuesParameterFormatString="original_{0}" SelectMethod="GetProducts" 
    TypeName="CustomerSupplierBLL.Product"> 
    <SelectParameters> 
     <asp:Parameter DbType="Guid" Name="supplierId" /> 
    </SelectParameters> 
</asp:ObjectDataSource> 

Так это хороший способ отделить слои?

ответ

1

Ваша таблица заказов ограничена. У вас может быть только один продукт за заказ. Возможно, вы на это надумали. Если нет, то неплохо иметь таблицу заказов и таблицу сведений о заказе. Таблица заказов будет иметь общие для всего заказа данные, такие как информация о клиенте, адрес доставки и т. Д. Первичный ключ таблицы детали заказа - это комбинация идентификатора заказа и номера позиции. Затем вы можете иметь несколько разных позиций за заказ ,

Ваш класс поставщика подразумевает, что каждый продукт может поставляться только от одного поставщика. Зачастую многие поставщики могут поставлять один и тот же продукт. Я оставлю это вам, чтобы выяснить, как реализовать. Вероятно, это связано с таблицей отношений между таблицами продуктов и поставщиков.

Вы не задали конкретно свой вопрос. О каких слоях вы говорите? Данные должны храниться в базе данных, бизнес-логике, хранящейся в среднем уровне, а уровень представления должен быть просто графическим интерфейсом на уровне доступа к данным, который не поддерживает вашу бизнес-логику. Похоже, вы сделали это достаточно хорошо.

+0

Привет, спасибо за чтение, но мой вопрос не для этого кода, который я только что опубликовал. Я просто делаю простой пример profject, чтобы показать способ разделения этих слоев. Конечно, это ограниченный код.Вопрос в том, стоит ли делать три отдельных проекта, один для Daos nad Dtos, один для BLL, имеющий ссылку на уровень доступа к данным и сохраняющий эту простую структуру. Или есть лучшие решения для этого? – jannagy02

Смежные вопросы