10

現在、ユーザー インターフェイス (Web ページ) BLL (マネージャーとドメイン オブジェクト) DAL (各ドメイン オブジェクトの DataAccess クラス) で構成されるアプリケーションがあります。

UI で以下を使用して、ドメイン オブジェクトを検索します。

protect sub Button1_Click()
{
    IBook book = BookManager.GetBook(txtID.Text);
}

これが私のBLLです

public class BookManager 
{
    public static IBook GetBook(string bookId)
    {
        return BookDB.GetBook(bookId);
    }
}

public class Book : IBook
{
    private int? _id
    private string _name;
    private string _genre;

    public string Name
    {
        get { return _name; }
        private set 
        {
            if (string.IsNullOrEmpty(value))
                throw new Exception("Invalid Name");
            _name = value;
        }
    }

    public string Genre
    {
        get { return _serial; }
        private set 
        {
            if (string.IsNullOrEmpty(value))
                throw new Exception("Invalid Genre");
            _genre = value;
        }
    }

    // Other IBook Implementations

}

最後に、これが私の DAL です

public class BookDB
{
    public static IBook GetBook(int id)
    {
        // Get Book from database using sproc (not allowed to use any ORM)
        // ?? Create IBook Item?
        // return IBook
    }

IBook オブジェクトを作成して Manager に返すにはどうすればよいでしょうか。BookDB から BookManager に DataTable を返し、Book オブジェクトを作成して返すようにしようと考えていますが、それは正しくないようです。これを行う別の方法はありますか?

編集:各レイヤーをプロジェクトに分離することにし、BLL への参照を追加しようとすると、DAL レイヤーで循環依存の問題が発生しました。DAL から Book クラスやインターフェイス、または BLL の何かにアクセスできません。ここで ado.net オブジェクトを使用し、管理者に ado.net オブジェクトから実際のオブジェクトを作成させる必要がありますか? これがそのレイアウト方法です

BLL.Managers - BookManager
BLL.Interfaces IBook
BLL.Domain - Book
DAL - BookDB.

ありがとう!

4

7 に答える 7

5

データのみを含むダミーの Book オブジェクトを作成できます。プロパティとメンバー値を取得、設定します。この本には、データベースのフィールドごとに 1 つのプロパティがありますが、何も検証しません。

データベースからオブジェクトを入力し、BLL に送信します。

オブジェクトを保存する場合は、BLL にも送信します。

それが理にかなっていれば、BLL のクラスはこれらのオブジェクトをラップできます。このように、DAL に送り返すのは簡単です。

ダミーブック:

public class DummyBook:IBook 
{
    private nullable<int> _id;
    private string _name;
    private string _genre;

    public string Id
    {
        get {return _id;}
        set {_id = value;}
    }

    public string Name 
    {
        get {return _name;}
        set {_name = value;}
    }

    public string Genre 
    {
        get {return _genre;}
        set {_genre= value;}
    }

}

ダルブック:

public class DALBook 
{
    public static IBook:GetBook(int id) 
    {
        DataTable dt;
        DummyBook db = new DummyBook();

        // Code to get datatable from database
        // ...
        // 

        db.Id = (int)dt.Rows[0]["id"];
        db.Name = (string)dt.Rows[0]["name"];
        db.Genre = (string)dt.Rows[0]["genre"];

        return db;
    }

    public static void SaveBook(IBook book) 
    {
        // Code to save the book in the database
        // you can use the properties from the dummy book
        // to send parameters to your stored proc.
    }
}

BLL ブック:

public class Book : IBook
{
     private DummyBook _book;

     public Book(int id) 
     {
         _book = DALBook.GetBook(id);
     }

     public string Name 
     {
         get {return _book.Name;}
         set 
         {
            if (string.IsNullOrEmpty(value))
            {
                throw new Exception("Invalid Name");
            }
            _book.Name = value;
         }
     }

     // Code for other Properties ...



     public void Save()
     {
         // Add validation if required
         DALBook.Save(_book);
     }

}

Edit1:ダミークラスは、独自のプロジェクトに入れる必要があります(モデル、コメントに記載されているとおりで問題ありません)。参照は次のように機能します。

DAL はモデル プロジェクトを参照します。
BLL はモデルと DAL を参照します。
UI は BLL を参照します。

于 2009-04-06T01:11:16.883 に答える
2

BookDB は IBook インスタンスを返す必要があります。データベースからドメインへのマッピングに関するリポジトリ パターンが気に入っています。

リポジトリの実装は、ドメイン オブジェクトのインスタンスを返します。これにより、テクノロジー (データベースの種類、Web サービス、[何か他のものを挿入]) およびデータの保存に使用される形式の影響を受ける可能性のある特定の永続化実装からコードの残りの部分が保護されます。

于 2009-04-06T05:25:53.043 に答える
1

私はおそらくExecuteReaderを使用して、データベースからコードでオブジェクトを作成します。これは、データテーブルの機能が多いため(おそらくリーダーによって作成されたため)、データテーブルのオーバーヘッドがリーダーよりも多いためです。データテーブルを使用して更新/削除を行っていないため、オーバーヘッドは必要ありません。

そうは言っても、BookManagerクラスで静的ヘルパーメソッドを作成します。

internal static IBook BookFromReader(IDataReader reader)
{
     Book B = new Book();
     B.Prop = reader.GetString(0);
     B.Rinse = reader.Repeat();
     return B;
}

これは、インターフェースを使用している理由は、実装を変更したい場合があるためです。最終的には、INovel:IBook、IReference:IBookなどがあり、データレイヤーに抽象ファクトリ実装が必要になる場合があります。

public static IBook GetBook(int id)
{
    // SqlCommand Command = new Command("SQL or sproc", ValidConnection);

    using(IDataReader DR = Command.ExecuteReader(id))
    {
        // checking omitted
        switch(DR.GetInt32(1))
        {
            case 0:
                 return BookManager.BookFromReader(DR);
            case 1:
                 return BookManager.NovelFromReader(DR);
            etc
        }
    }
}

ここでのDALのもう1つの利点は、ルックアップをキャッシュできることです。調べた本を保持する辞書を作成して、既に返したオブジェクトに対する余分なdb呼び出しを減らすことができます。更新が行われると、キャッシュされたエンティティを削除します...それは別の投稿です。

複数のアセンブリを使用している場合、インターフェイスとヘルパーメソッドはニュートラル(非依存)アセンブリに存在する必要があります。現在、blog-o-sphereでは、アセンブリの数を減らす動きがあります。これは、依存関係の減少などを意味します。

これは私がこのトピックについて読んだブログからのリンクです:http: //codebetter.com/blogs/patricksmacchia/archive/2008/12/08/advices-on-partitioning-code-through-net-assemblies.aspx

最終的に、答えは、データレイヤーがインターフェイスのインスタンスをビジネスレイヤーに返すことだと思います。

幸運を :-)

于 2009-04-06T01:19:53.150 に答える
1

私の意見では、DAL に BLL へのアクセスを許可しないでください。それは不必要な依存関係です。

Book クラスを新しいプロジェクト (おそらく DomainModel という名前) に配置すると、循環参照が修正されます。次のようなことができます。

プロジェクト BLL 参照 DAL および DomainModel

プロジェクト DAL 参照 DomainModel

プロジェクト UI リファレンス BLL と DomainModel

プロジェクト DomainModel 参照なし

于 2009-07-08T04:50:45.183 に答える
0

返したい DataTable はデータベース関連であり、BLL の場合、使用しているデータベースとスキーマが何であるかを気にする必要はありません。DB-Object Mapper を使用して、dbtable を DAL のオブジェクトにマップできます。

于 2009-04-06T00:34:06.380 に答える
0

意図したモデルに従うこと。データ アクセス層 (DAL) は、データ ソースとの間でデータを取得および送信する役割を果たします。

DAL は、BLL が使用しているビジネス エンティティを気にする必要はありません。DAL の唯一の仕事は、データを取得してニュートラル オブジェクトで返すことだからです。一般的な再利用可能性のために中立でなければなりません。

ビジネス ロジック レイヤー (BLL) は、DAL がデータの取得または書き込みを行う方法を気にする必要はありません。

BLL と DAL の間で通信するには、ニュートラル オブジェクトを使用する必要があります。

BLL は、オブジェクトのプロパティを個々のパラメーターとして DAL のメソッドに渡します。DAL のパラメーターは、文字列、int、bool、通信しているデータベースのバージョンに固有でもなく、BLL にのみ存在する特定の型でもないその他の .NET オブジェクトを使用してニュートラルです。

DAL は、どこからでもデータを取得し、ニュートラル データ オブジェクトを呼び出し元に返します。これは、たとえば、DataSet または DataTable、または使用しているデータベースの種類/バージョンに固有ではないその他のオブジェクトである可能性があります。したがって、DataSet と DataTable は System.Data 名前空間内のオブジェクトであり、System.Data.SQL などの名前空間ではありません。

本質的に: - BLL はニュートラル型を DAL に渡します (例: string、int、bool、long、float など)。 DAL はニュートラル データ型を BLL に返します (例: DataSet、DataTable など)。BLL は、これらのニュートラル データ型のコンテンツを使用して、特定のビジネス エンティティを作成、入力、および返す役割を果たします。

BLL は DAL を参照する必要があります。それでおしまい。

もちろん、このモデルを完全に無視して、IBOOKなどを使用して以前に提案されたのと同じくらいハックすることもできます...しかし、意図したモデルを使用していないよりも、すべてを単一のアセンブリに投げ込むことはできません。とにかく独立して維持してください。

于 2010-06-04T11:20:18.717 に答える
0

DataTable を返したくない場合は、BookManager から IBook の実装を渡して、DAL に入力することができます。

于 2009-04-06T00:43:55.280 に答える