我正在开发一个 ASP.NET 应用程序来在生产中进行错误统计。我开始把它分成几层:表示、业务逻辑、数据访问
我创建了一个简单的项目来描述这个问题。
示例数据库是这样的:
在我的数据访问层中,我使用了类似类的 DAO 模式
例如,我的数据访问层中的 ProductDao 和 ProductDto 类是:
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 框架。
例如,要显示产品,我使用 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>
那么这是分离图层的好方法吗?