0

共有フィールドと関数を持つ BaseDataClass があります

    Protected Shared dbase as SqlDatabase
    Protected Shared dbCommand as DBCommand
    ...
    //also have a sync object used by the derived classes for Synclock'ing
    Protected Shared ReadOnly syncObj As Object = New Object()

    Protected Shared Sub Init() //initializes fields, sets connections 
    Protected Shared Sub CleanAll() //closes connections, disposes, etc.

この基本クラスから派生したいくつかのクラスがあります。Shared派生クラスには、インスタンス化なしで BLL から直接呼び出すことができるすべての関数があります。
これらの派生クラスの関数は、ベースの Init() を呼び出し、特定のストアド プロシージャを呼び出し、ベースの CleanAll() を呼び出してから、結果を返します。

したがって、それぞれ 10 個の関数を持つ 5 つの派生クラスがあり、合計で 50 個の関数呼び出しが可能である場合、それらはすべてSharedであるため、CLR は一度に 1 つしか呼び出しませんよね? Sharedすべての呼び出しはキューに入れられ、各関数が完了するまで待機します。

SharedDAL に関数を持ち、基本クラスの関数を保持するより良い設計はあり ますか? または、基本クラスがあるので、DAL 内のインスタンス メソッドに移行する方がよいでしょうか?

4

1 に答える 1

0

この特定のケースでは、ノーと言います。これは良い設計ではありません。これを正しく機能させるには、すべてのクラスのすべてのメソッド呼び出しで最初にロックを取得しsyncObjて、同じリソースに対して複数のスレッドが競合するために状態が破損しないようにする必要があります。そのために発生する可能性のある潜在的なパフォーマンスへの影響を無視すると、派生クラスはすべて同じ「もの」を使用しているため、派生クラスを独立して動作させることはできません。

この場合、インスタンスメソッドを推すことを強くお勧めします。個々のクラスで同じSqlConnectionものを使用したい場合は、依存性注入を使用してクラスに渡します。

于 2010-04-23T19:26:27.833 に答える