2012-02-18 8 views
0

私は、データベースにアクセスするためのWebサービスを提供し、.NETクラスを通してそれを公開するシステムに対して開発中です。通常の作業方法は、データベースにアクセスしてそのインスタンスを直接使用する必要があるときはいつでもWebサービスクラスのインスタンスを作成することです。もちろんこれはIoCに完全に反し、ほとんどテストされていないコードを作成します。私は今、IoCを使って(もっと)SOLIDコードを書くことができる新しい標準的な作業方法を考案しようとしています。IoC/SRPデザインの問題

私の現在のソリューションは、この(本当によく説明されていない)である:

Webサービスは、保護されたメンバーとしてのWebサービスオブジェクトを格納し、一般的に使用される一般的なデータベースの数へのアクセスを提供し DatabaseConnectionクラスにラップされ

コール。

私は実際のアプリケーションでデータベースアクセスが必要なときに、そのクラス(新しいクラスを呼び出し、たとえばApplicationDatabaseConnection)から派生し、Webサービスを呼び出すことができるメソッドで必要なデータベース対話を実装します。

このクラスはアプリケーションで直接使用されるのではなく、アプリケーションのさまざまな部分に「コネクタ」インターフェイスを提供します。各インターフェイスは、トップレベルのクラスのようなコントローラ/ビューモデルで表されます。これらのアプリケーション関数のいずれかが呼び出されると(UIなどから)、適切なコントローラオブジェクトが作成され、ApplicationDatabaseConnectionオブジェクトがそれぞれの「コネクタ」インタフェースの実装として渡されるため、データベースアクセスはカプセル化され、その時点でデカップリングされます。私が知る限り。

私の問題は次のとおりです。これは実際にISP(インターフェイス分離原理)を自分のコードで実際に使用した最初のケ​​ースですが(コンセプトの実際に賢明な使用かどうかはわかりませんが)私は、このクラスがあまりにも多く、SRPに違反する可能性があることを恐れています(単一責任の原則)。または、「複数の異なる消費者のためにデータベースアクセスを提供するだけです」という単一の責任はありますか?私は考えることができる選択肢が本当にどちらか私には理想的でないようで

DatabaseConnection 
    protected m_webservice 
    public OftenUsedDatabaseAccess() 

ApplicationDatabaseConnection : DatabaseConnection, IConnectorA, IConnectorB 
    public IConnectorA.RetrieveRecords(fieldValue) 
    public IConnectorB.WriteStuff(listOfStuff) 

FunctionAController 
    private m_IConnectorA 

FunctionBController 
    private m_IConnectorB 

多分それはビットをより明確にするために、ここでは関係のクラスがどのように見えるかを大まかにです。

データベースアクセス機能を分割するには、ApplicationDatabaseConnectionクラスは唯一(IConnectorAFactoryの背後にある、IConnectorBFactoryインターフェース)異なるコネクタ用Createメソッドを持つファクトリクラスかもしれない - しかし、工場出荷時のパターンを必要とするが何が本当に存在しません。 「コントローラ」オブジェクトをインスタンス化するときに私が知っていることは何もありません。

また、実際のコネクタクラスは基本的に同じ基本能力を必要とするので、DatabaseConnectionの派生である必要があります。その後、(全体では)構造全体がかなり不吉なものになります。

私は思考の中である時点で間違った方向に向いていると思いますが、今は完全に間違ったトラックに入っています。このようなソリューションの構造はどのように見えますか?正しい方向へのプッシュは大いに感謝されます。

編集:

@Tobias「答えは私は重要な細部を忘れてしまったことを実感しました:1である2つのほとんど同じ能力を持つWebサービスの異なるバージョンが、完全に異なるAPIがありますが、理由はカプセル化されるを持っています。

論理クラスがWebサービスに直接(またはインターフェイス経由で)アクセスする場合、それらはすべて詳細にWebサービスクエリを構築することにも関わっているため、より密接に結合されたコード私たちはこれまでに製作してきました)、SRPに違反しています。

答えて

0

「ApplicationDatabaseConnection」アプローチは、SRPに違反するだけでなく、OCPにも違反してモジュール化を妨げることが数ヶ月後に分かっています。

私が最終的に取ったルートは、私が説明した "工場"の代替案に少し似ていました。 "メイン" DatabaseConnectionオブジェクトは、特定のDatabaseConnection派生のファクトリを取得する "Create"メソッドを持つサブクラスです。正確に何が作成されているか心配していません。このようにして、各コントローラはそれ自身の接続オブジェクトを要求することができ、メインアプリケーションが(MEFを介して)知らないコントローラを追加することができる。

0

MyWebServiceのようなインターフェイスを作成し、サービスを呼び出すMyWebServiceImplに実装するだけではどうですか。

関連する問題