0

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

私の現在の解決策はこれです(あまり説明されていません):

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

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

このクラスはアプリケーションで直接使用されませんが、アプリケーションのさまざまな部分に「コネクタ」インターフェイスを提供します。各部分は、最上位のクラスのようなコントローラー/ビュー モデルによって表されます。これらのアプリケーション関数の 1 つが (たとえば 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ファクトリ クラスにすることしかできませんが、ファクトリ パターンを必要とするものは実際には何もありません。「コントローラー」オブジェクトをインスタンス化するときだけ知っていることは何もありません。CreateIConnectorAFactoryIConnectorBFactory

また、実際のコネクタ クラスも基本的に の派生でDatabaseConnectionある必要があります。これは、同じ基本機能が必要であり、(遅くとも) 構成全体がかなり不吉になるからです。

私は自分の思考のある時点で間違った方向に進み、今では完全に間違った方向に進んでいると思います. そのようなソリューションの構造はどのように見えるべきですか? 正しい方向へのプッシュは大歓迎です。

編集:

@Tobias の回答により、重要な詳細を忘れていたことに気付きました。Web サービスには、ほぼ同じ機能を備えた 2 つの異なるバージョンがありますが、API が完全に異なります。これが、カプセル化する必要がある理由の 1 つです。

もう 1 つは、私のロジック クラスが Web サービスに直接 (またはインターフェイス経由で) アクセスする場合、それらは Web サービス クエリを詳細に構築することにも関係しているため、より緊密に結合されたコード (私たちが行ってきたようなもの) が作成されます。これまでのところ生産) であり、SRP に違反しています - したがって、コネクタ インターフェイスのアイデアです。

4

2 に答える 2

0

MyWebServiceのようなインターフェイスを作成し、サービスを呼び出すMyWebServiceImplに実装してみませんか?uourサービスと同じメソッドを公開し、それに委任することができます...

于 2012-02-18T00:23:50.520 に答える
0

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

私が最終的にたどったルートは、私が説明した「工場」の代替案に少し似ていました.正確には何を作成します。こうすることで、各コントローラーが独自の接続オブジェクトを要求でき、メイン アプリケーションが知らないコントローラーを追加できます (つまり、MEF 経由)。

于 2012-09-23T20:34:53.480 に答える