4

データベースに保存されている設定を取得する関数を持つ MainForm クラスがあります。

ここまでは順調ですね。

次に、起動時にロードするプラグイン (DLL) がありますが、同じ関数を使用して DLL の設定を取得したいと考えています。

DLL 内の関数にアクセスする必要がある場合は、単に と入力しますが、DLL は MainForm を認識しないため、DLL からmyDLL.function(....)は使用できません。MainForm.function

では、メイン アプリケーションと dll の間で設定を渡すにはどうすればよいでしょうか。

4

2 に答える 2

4

用語を知っているように、「制御の反転」または「IoC」を探しています。

Nico's answer のように、依存性注入やコールバック (デリゲートなど)など、これを実装する方法は複数あります。Service Locator (多くの人はこれを「アンチパターン」と見なしていますが) と Factory もあります。

個人的には、依存性注入アプローチを好みます。

基本的に、DLL (別名「クラス ライブラリ」) は関数を実行できるオブジェクトを必要としますが、実際のロジックを実装するには他の誰か (呼び出し元) が必要です。

したがって、必要なオブジェクトの種類を定義するインターフェイスを DLL に作成するだけです。

Namespace DLL

    Public Interface IDataRetriever

        Public Function GetData() As Object

    End Interface

End Namespace

次に、DLL を参照する MainForm プロジェクトで、このインターフェイスを実装するクラスを作成します。

Public Class DataRetriever
    Implements DLL.IDataRetriever

    Public Function GetData() As Object Implements DLL.IDataRetriever.GetData
        //...
        Return New Object()
    End Function

End Class

(既に存在するクラスや MainForm 自体を含め、任意のクラスがインターフェイスを実装できることに注意してください。インターフェイスのためだけに新しいクラスを作成する必要はありませんが、関心の分離に従っていることを確認してください。)

これで、DLL を呼び出すときに DataRetriever を渡すことができ、DLL は何を処理しているかを認識します。

Namespace DLL

    Public Class Utility

        Public Shared Function DLLFunction( retriever as IDataRetriever )
            retriever.GetData()
        End Function

    End Class

End Namespace

 

Class MainForm

    Sub Example()

        DLL.Utility.DLLFunction( New DataRetriever() )

    End Sub

End Class
于 2013-06-13T20:26:43.703 に答える
2

それは、あなたが持っている設定の種類によって異なります。

おそらく最もクリーンな方法は、メイン アプリケーションで設定を取得し、それを (パラメーターとして) DLL に渡すことです。実際の設定データのインターフェイスなどを指定したい場合があります。この共通型は、DLL とメイン アプリケーション プロジェクトの両方によって参照されるプロジェクト内にある可能性があります。

もう 1 つの方法は、デリゲートを渡すことです。完全な設定データを渡す代わりに、データを取得できるメソッドにデリゲートを渡します。

于 2013-06-13T20:27:50.083 に答える