1

基本的な3層設計を使用しています。柔軟性(およびテスト)の目的で、データレイヤーを抽象化し、コードで具象クラスを指定する必要がありました。しかし、これをどのようにビジネスオブジェクトに渡す必要がありますか。次に例を示します(擬似コード)。

abstract class IDataLayer
{
    PersonData GetPerson(int); //PersonData would be a row of data from a table for example
    JobData[] GetJobs(int);
    void UpdatePerson(PersonData);
}

class ConcreteDataLayerSQL : IDataLayer
{
...
}
class ConcreteDataLayerXML : IDataLayer
{
...
}

class PersonBAL
{
    void PersonBAL(personId)
    {
        //What goes here?
    }

    JobBAL[] GetJobs()
    {
       //What goes here?
    }
}
class Program
{
    static void Main()
    {
        person = new PersonBAL(1);
    }
}

問題は、PersonBALがどのConcreteDataLayerを使用するかをどのように知るかということです。私はいくつかのオプションの間で考えています:

1:具体的なデータレイヤーを人に渡します。これは、データレイヤーと対話する必要のある新しいクラス(新しいPersonBAL(IDataLayer、int)、次に新しいJobBAL(IDataLayer、int)など)を追加し始めるときに苦痛になります。

2:使用するデータレイヤーを保持する静的オブジェクトを作成します(読み取り:グローバル変数)

他のアイデアはありますか?

4

3 に答える 3

1

あなたが解決しようとしている問題は「依存性注入」です。

これが.NETコード(疑似コード言語はC#によく似ています)であると仮定すると、この種の目的で設計されたSpring.NETのようなフレームワークを調べることをお勧めします。

于 2009-08-27T01:02:03.483 に答える
0

インスタンスを構築するために使用するPersonBAL代わりに を直接構築しないように、コードに間接層を配置することができ ます。ファクトリには、コンストラクターを介して渡される (アプリケーションの起動時に接続される) IDataLayer への依存関係があり、PersonId を使用して人物を作成するようにファクトリーに指示すると、ID を渡す新しい PersonBAL が作成され、 IDataLayer. そうすれば、ユーザーは使用している IDataLayer を気にする必要がなく、起動時にアプリケーション構成で設定され、ユーザーは知っている情報を使用して新しい PersonBAL を要求するだけです。PersonBALFactoryPersonBAL

DI フレームワークは、正しいタイプがコンストラクターに渡されるようにすべての依存性注入を構成するのに役立ち、多数のファクトリーがあれば、ファクトリー (およびファクトリーに依存するもの) の構成を自動化および簡素化します。または複雑な依存関係グラフ。

于 2010-11-25T11:24:38.770 に答える