web-dev-qa-db-ja.com

Webサイトでモデルとデータアクセスレイヤーオブジェクトをどのように設計すればよいですか?

私は仕事中のWebサイトのデータレイヤーの設計を任されており、最高の柔軟性、保守性、可読性を実現するコードのアーキテクチャに非常に興味があります。

私は一般的に、実際のモデルをデータアクセスレイヤーから完全に分離することの重要性を強く認識しているため、モデルはデータアクセスに関して完全にナイーブです。そしてこの場合、モデルはデータベースから構築されたり、SOAP Webサービスから構築されたりする可能性があるため、これを行うと特に便利です。

したがって、モデルオブジェクトを作成するファクトリをデータアクセスレイヤーに含めるのは理にかなっているように思えます。だからここに私がこれまでに持っているものがあります(私の作った疑似コードで):

class DataAccess.ProductsFromXml extends DataAccess.ProductFactory {}
class DataAccess.ProductsFromDatabase extends DataAccess.ProductFactory {}

これらは、次のような方法でコントローラーで使用されます。

var xmlProductCreator = DataAccess.ProductsFromXml(xmlDataProvider);
var databaseProductCreator = DataAccess.ProductsFromXml(xmlDataProvider);

// Returns array of Product model objects
var XmlProducts = databaseProductCreator.Products();
// Returns array of Product model objects
var DbProducts = xmlProductCreator.Products();

だから私の質問は、これは私のデータアクセス層に適した構造ですか?データからモデルオブジェクトを構築するためにファクトリを使用することは良い考えですか?私が何かを誤解したと思いますか?また、モデルオブジェクトを作成するためにデータアクセスオブジェクトを作成する方法について、一般的なパターンはありますか?

7
Robin Winslow

私は一般的に、実際のモデルをデータアクセスレイヤーから完全に分離することの重要性を強く認識しているため、モデルはデータアクセスに関して完全にナイーブです。

これは永続性の無知と呼ばれます。データアクセス層に導入したいもう1つの概念は repository です。リポジトリの中心的な機能は、データアクセスをカプセル化することです。

MVCアーキテクチャーでは、コントローラーはリポジトリーを参照してデータにアクセスします。データ形式の特定の詳細はリポジトリによって非表示にする必要があります。これにより、コントローラは永続性を知らないままになります。ただし、あまりにも多くの抽象化を試みた場合、リポジトリが誤って適用されることがあります。リポジトリを過度に汎用的にして、あらゆるタイプのデータアクセスシナリオを処理できるようにしないでください。失敗する可能性が高く、単純化するよりもはるかに複雑な不要な抽象化が多数発生することになります。

5
eulerfx