私は、データベースにアクセスするための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に違反しています。