本番環境でエラー統計を作成する 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 フォーム フレームワークを使用しました。
たとえば、製品を表示するには、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>
これはレイヤーを分離する良い方法ですか?