-1

本番環境でエラー統計を作成する 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>

これはレイヤーを分離する良い方法ですか?

4

1 に答える 1

1

注文テーブルは限られています。1回の注文で1つの製品しか持てません。おそらくあなたはこれを意図していました。そうでない場合は、Order テーブルと Order Details テーブルを用意することをお勧めします。注文テーブルには、顧客情報、配送先住所など、注文全体に共通のデータがあります。注文詳細テーブルの主キーは、注文 ID と品目番号の組み合わせです。その後、注文ごとに複数の異なるアイテムを持つことができます。 .

サプライヤ クラスは、各製品が 1 つのサプライヤからのみ提供されることを意味します。多くの場合、複数のサプライヤーが同じ製品を供給することがあります。実装方法を理解するためにそれをあなたに任せます。おそらく、Product テーブルと Supplier テーブルの間の関係テーブルが関係しています。

あなたは特にあなたの質問をしていません。どのレイヤーについて話しているのですか?データはデータベースに格納し、ビジネス ロジックは中間層に格納する必要があります。プレゼンテーション レイヤーは、ビジネス ロジックを保持しないデータ アクセス レイヤーへの単なる GUI にする必要があります。あなたはそれを十分にやったようです。

于 2013-06-02T04:53:53.503 に答える