2

3層のWinFormアプリケーションを作成しようとしています。これは3層設計の最初の試みであるため、行き詰まり、いくつか質問があります。

アプリケーションは、複数のsqlitedbファイルの添付をサポートします。

だから私はこのようなクラスを作成しました

public class Database
{
    public string Name { get; set; }
    public string FilePath { get; set; }
    public bool isAttached { get; private set; }
}

今、私はそれらのオブジェクトのコレクションが欲しいです。

以下のDatabaseListのような別のクラスを作成する必要がありますか、それともリストを作成するだけで十分ですか?

public class DatabaseList : List<Database>
{
...

vs

List<Database> myDatabases;

Form1.csで何を作成する必要がありますか?

たとえば、上記のコレクションはForm1.csではなくBusinessLayerで作成する必要があり、Form1.csではBusinessLayerクラスのみが作成されると想定しています。これは正しいです?

アタッチメソッドはどこに配置しますか?

メソッドは次のようになります。

    public void AttachDB(Database db)
    {
        MySqliteHelper.Attach(db.Name, db.FilePath);
        this.Add(db);
    }

メソッドをDatabaseListクラスに配置しますか(これがコレクションを作成する方法である場合)、それともBusinessLayerに配置する必要がありますか?

Attachメソッドを作成して、単一のファイルに存在するMS SQLCompactEditionなどの追加のリレーショナルデータベースをサポートする方法

MySqliteHelperと同じメソッドを使用して別の一般的なデータベースヘルパークラスを作成することを考えていましたが、AttachDBメソッドが代わりにそれを呼び出します。何かのようなもの

MyDBHelper.Attach(db.Name, db.FilePath);

それとも、これはDependency InjectionslikeNinjectが役立つ場合がありますか?私は以前にそれを使用したことがなく、Ninjectから思い出しているのは、さまざまな武器を持っている侍だけなので、特定のデータベースクラスが異なるという私の問題に少し似ているようです。

4

3 に答える 3

4

この質問は多くの分野をカバーしているので、部分的に取り組むつもりです。

3層アーキテクチャとして適格なものは何ですか?

3層(またはn層、層型)アーキテクチャは、基本的に、実際の層がどれほど薄くても、インターフェイスがデータベースと直接通信しない設計です。データを取得および保存する関数を使用して単一のクラスを作成することもできますが、それでも3層アーキテクチャとしての資格があります。そうは言っても、以下で説明するのは、おそらく3層アーキテクチャの最も一般的な実装です。

レイヤーとティア:違いは何ですか?

3層アーキテクチャを理解するには、最初に1つの層と1つの層を区別することが重要です。アプリケーションには多くの物理層を含めることができますが、それでも3つの論理層しか含めることができません。写真が本当に百万語の価値がある場合、下の図はあなたのためにそれを明らかにするはずです。

ここに画像の説明を入力してください

上の図では、ビジネス/中間層は、ビジネスロジック、ビジネスオブジェクト、およびデータアクセスオブジェクトで構成されています。この層の目的は、ユーザーインターフェイスとデータベースの間の仲介者にサービスを提供することです。

データアクセス層(DAL)

データアクセス層は、データアクセスコンポーネント(以下を参照)と1つ以上のデータアクセスオブジェクトで構成されます。必要に応じて、データアクセスオブジェクトは通常、次の2つの方法のいずれかで設定されます。

  1. ビジネスオブジェクトごとに1つのデータアクセスオブジェクト
  2. 多くのビジネスオブジェクトによって共有される1つのデータアクセスオブジェクト

複数のデータベースを扱うように思われるので、1対1のオプションを使用するのはおそらく理にかなっています。このようにすると、どのデータベース/接続がどのビジネスオブジェクトに対応するかを柔軟に指定できます。

ここに画像の説明を入力してください

データアクセスコンポーネント

データアクセスコンポーネントは、データベースに接続して対話するために必要な最低限のメソッドのみを含む非常に汎用的なクラスである必要があります。dbConnection上の図では、そのコンポーネントはクラスによって表されています。

質問と回答

Form1.csで何を作成する必要がありますか?

フロントエンドが扱うのは、ビジネスオブジェクトとビジネスロジックだけです。時々それはその白黒ではありません、しかしそれは考えです。

アタッチメソッドはどこに配置しますか?

メソッドの代わりにAttach、接続文字列をデータアクセスコンポーネントに渡します。接続文字列を使用して、ほとんどすべてのデータベースに接続および/または接続できます。

Attachメソッドを作成して、単一のファイルに存在するMS SQL Compact Editionなどの追加のリレーショナルデータベースをサポートするにはどうすればよいですか?

上記を参照。

以下のDatabaseListのような別のクラスを作成する必要がありますか、それともリストを作成するだけで十分ですか?

正直なところ、これはあなた次第であり、3層アーキテクチャの有効性には影響しません。あなたはあなたが満たそうとしている特定の要件を知っているので、それが理にかなっているならそれをしてください。ただし、リストから選択されたデータベースでクエリと非クエリを実行するためのメソッドを公開する必要があるため、データアクセスオブジェクトがこのクラスとどのように相互作用するかを考慮してください。

于 2012-05-04T19:04:54.897 に答える
2

あなたが欠けているのは、オブジェクトとその責任の観点から考えることです。

データベース記述のインスタンスの作成を担当するオブジェクトはどれですか?それはすべきForm1ですか?

OOPは、そのような疑問がある場合は、Pure Fabricationの原則に従い、これを担当する別のクラスを作成するだけでよいと言っています。これも同じくらい簡単です。

したがって、クラスを作成し、それを呼び出してDatabaseManager、データベースのリストとAttachメソッドをそこに配置できます。また、このマネージャーをアンビエントクラス(他のクラス間で共有される同じインスタンス)にして、シングルトンを構築できるようにすることもできます(ただし、これは必須ではありません)。

DIコンテナーは、サービスを整理してその存続期間を管理するのに役立つ可能性がありますが、アイデアを誤用する前に、これに関する優れた本から始めることをお勧めします。MarkSeemannの「.NETでの依存関係の注入」は問題ありません。

于 2012-05-02T11:56:40.240 に答える
1

モジュール性と抽象化の観点から考える必要があります。レイヤー間で渡される複数のエンティティがあることを確認してください。

次に例を示します。1。プレゼンテーションは、ビジネスレイヤーまたはビジネスファサードのオブジェクトを作成します。しかし、それはビジネス層からの論理エンティティを期待します。

  1. ビジネスレイヤーは、DataAccessのオブジェクトを作成し、DataAccessの論理エンティティがビジネスオペレーションを実行することを期待します。

  2. DataAccessは、データベースから情報を取得するために実行したいことをすべて実行します。したがって、oracle / sql / sqllite /ファイルシステムに接続する必要がある場合は、論理エンティティを変換または初期化する必要があります(エンティティはプロパティのみで構成されるクラスです)。

したがって、すべてのレイヤーには独自の責任があり、責任のある操作を実行します。

したがって、db関連の操作はDataAccessで行われると思います。

于 2012-05-04T17:53:46.867 に答える