【发布时间】:2018-04-10 14:22:12
【问题描述】:
想象在 VB.NET 中我有一个名为 hostlink.mq 的解决方案
我在其中创建了一个名为 hostlink.interfaces 的项目,另一个名为 hostlink.activemq 的项目,以及另一个名为 hostlink.IbmMq 的项目。后两者实现了在 hostlink.interfaces 项目上创建的接口。
也就是说,我需要在运行时选择要运行的实现。每个实现项目都有自己对特定于该实现的 nuget 包的引用。在接口项目上,我不想包含对实现项目的引用。我需要以某种方式在运行时获取参考。我知道下面发布的连接工厂选择器代码不起作用,因为我没有对接口上的实现的引用:
Private Function GetOrAddConnectionFactory(provider As MqProvider) As IMqConnectionFactory
If _connectionFactories.ContainsKey(provider) Then
Return _connectionFactories(provider)
Else
Select Case provider
Case MqProvider.IbmMq
_connectionFactories.Add(provider, New IbmMq.ConnectionFactory(_log))
Case MqProvider.ActiveMq
_connnectionFactories.Add(provider, new ActiveMq.ConnectionFactory(_log))
End Select
Return _connectionFactories(provider)
End If
End Function
我想知道的是如何选择正确的实现并在运行时添加它以避免在接口上引用它们。
与此相关的另一个问题:其中一个实现必须针对 3.5 框架,因为该实现没有适用于 4.x 框架的 nuget 包,而另一个可以(并且应该)使用 4.x 框架。我可以将接口项目定位为 4.x 框架,同时保留一个针对 3.5 框架的实现吗?或者它必须是相反的方式,针对 3.5 框架的接口和针对 4.0 框架的实现之一?该接口没有任何需要 4.0 框架的特定内容。
我不习惯 Visual Studio 语言,在 java 中我会使用像 Spring 这样的注入框架并在运行时注入引用。
【问题讨论】:
-
控制模式的依赖注入或反转并不特定于任何特定的编程语言。而且Spring是一个通用的应用程序框架,不仅仅是做基于注入的设计
-
@Adyson,我知道 Spring 不仅仅是注入,我只是引用它以便人们知道我来自哪里