1

私は、DDD の哲学を使用して開発されているビジネス アプリケーションに取り組んでいます。データベースは NHibernate を介してアクセスされ、データ層は DAO パターンを使用して実装されます。

UML クラス図を以下に示します。

UML クラス図 http://img266.imageshack.us/my.php?image=classdiagramhk0.png http://img266.imageshack.us/my.php?image=classdiagramhk0.png

デザインの良し悪しはわかりません。どう思いますか?

でも問題はデザインの良し悪しではありません。問題は、アプリケーションを起動した後IDaoFactory、プレゼンテーション層でインスタンス化され、以下のように (MVC パターンを使用して設計された) プレゼンター クラスにパラメーターとして送信されます。

...
IDaoFactory daoFactory = new NHibernateDaoFactory(); //instantiation in main class
...
SamplePresenterClass s = new SamplePresenterClass(daoFactory);
...

1 つのデータ プロバイダー (1 つのデータベース) だけを使用するのは簡単でした。しかし、XML からもデータを取得する必要があります。そして、開発の次の段階では、さまざまな Web サービスに接続し、受信データと送信データを操作する必要があります。

XML からのデータは、列挙型であるキーを使用して取得されます。という名前のクラスXMLLoaderをデータ層に追加し、インターフェイスILoaderをドメインに追加します。XMLLoader署名が

List<string> LoadData(LoaderEnum key)

以下のように、プレゼンテーション層で XMLLoader を使用して ILoader をインスタンス化する場合、データ層から XML データを取得するオブジェクトにそれを送信する必要があります。

ILoader loader = new XMLLoader();
SamplePresenterClass s = new SamplePresenterClass(daoFactory, xmlLoader);

Web サービス アクセス クラスの実装後

SamplePresenterClass s = new SamplePresenterClass(daoFactory, xmlLoader, sampleWebServiceConnector1, sampleWebServiceConnector2, ...);

パラメータは時間の経過とともに大きくなります。クラス内のデータ アクセス オブジェクトのすべてのインスタンスを保持し、必要なプレゼンターに渡すことができると思います (シングルトン パターンも役立つ場合があります)。ドメイン層には、次のようなクラスが必要です。

public class DataAccessHolder
{
    private IDaoFactory daoFactory;
    private ILoader loader;
    ...
    public IDaoFactory DaoFactory
    {
        get { return daoFactory; }
        set { daoFactory = value; }
    }
    ...
}

メイン クラスでは、次のようにこの設計でインスタンス化を行うことができます。

DataAccessHolder dataAccessHolder = new DataAccessHolder();
dataAccessHolder.DaoFactory = new NHibernateDaoFactory();
dataAccessHolder.Loader = new XMLLoader();
...
SamplePresenterClass s = new SamplePresenterClass(dataAccessHolder);

このデザインについてどう思いますか、それとも別のデザインを提案してもらえますか?

回答者の皆様ありがとうございます...

4

1 に答える 1

1

IMO、「グローバル」または静的な daoFactory を使用して汎用にする方がクリーンです。

DaoFactory<SamplePresenterClass>.Create(); // or
DaoFactory<SamplePresenterClass>.Create(id); // etc

DaoFactory<T>次に、たとえば、のみを取るように定義できIDaoます

interface IDao
{
    IDaoProvider GetProvider();
}

interface IDaoProvider
{
    IDao Create(IDao instance);
    void Update(IDao instance);
    void Delete(IDao instance);
}

基本的に、すべてのコンストラクターに DaoFactory を渡す代わりに、静的なジェネリック DaoFactory を使用します。その T は IDao から継承する必要があります。次に、DaoFactory クラスは実行時に T プロバイダーを参照できます。

static class DaoFactory<T> where T : IDao, new()
{
    static T Create()
    {
        T instance = new T();
        IDaoProvider provider = instance.GetProvider();

        return (T)provider.Create(instance);
    }
}

IDaoProvierクラスに応じて、XML、NHibernate、Web サービスなどを使用してロードするために実装する一般的なインターフェイスはどこにありますか。(各IDaoオブジェクトは、そのデータ プロバイダーに接続する方法を知っています)。

全体的に、悪いデザインではありません。もう少し OO を追加すると、かなり洗練されたデザインになります。たとえば、 の各ファイルはとしてXmlEnums実装できます。IDao

class Cat : IDao
{
    IDaoProvider GetProvider()
    {
        return new XmlLoader(YourEnum.Cat);
    }

    // ...
}
于 2008-10-28T14:44:13.520 に答える