私は、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);
このデザインについてどう思いますか、それとも別のデザインを提案してもらえますか?
回答者の皆様ありがとうございます...