4

我有一个 MainForm 类,我有一个函数来检索存储在我的数据库中的设置。

到目前为止,一切都很好。

然后,我有一个在启动时加载的插件 (DLL),但我想使用相同的函数来检索我的 DLL 中的设置。

如果我需要访问我的 DLL 中的函数,我只需键入myDLL.function(....),但我不能MainForm.function从我的 DLL 中使用,因为我的 DLL 不知道 MainForm。

那么如何在我的主应用程序和我的 dll 之间传递我的设置呢?

4

2 回答 2

4

只是为了让您知道术语,您正在寻找“控制反转”或“IoC”。

有多种方法可以实现这一点,包括Nico 的回答中的依赖注入和回调(例如委托)。还有服务定位器(尽管许多人认为这是一种“反模式”)和工厂。

就个人而言,我更喜欢依赖注入方法:

基本上,您的 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 和主应用程序项目都引用的项目中。

另一种方法是传递委托。您将委托传递给可以检索数据的方法,而不是传递完整的设置数据。

于 2013-06-13T20:27:50.083 回答