У меня есть приложение ASP.NET для создания статистики ошибок в процессе производства. Я начал делать это слоями: презентация, бизнес-логика, доступ к даннымЯвляется ли это хорошим способом разделения слоев в приложении ASP.NET?
Я создал простой проект для описания вопроса.
Образец базы данных заключается в следующем:
В моем слое доступа к данным я 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>
Так это хороший способ отделить слои?
Привет, спасибо за чтение, но мой вопрос не для этого кода, который я только что опубликовал. Я просто делаю простой пример profject, чтобы показать способ разделения этих слоев. Конечно, это ограниченный код.Вопрос в том, стоит ли делать три отдельных проекта, один для Daos nad Dtos, один для BLL, имеющий ссылку на уровень доступа к данным и сохраняющий эту простую структуру. Или есть лучшие решения для этого? – jannagy02