VB.NET在运行时从接口中选择实现

时间:2018-04-10 14:22:13

标签: vb.net interface

在VB.NET中想象我有一个名为hostlink.mq的解决方案

我在其中创建了一个名为hostlink.interfaces的项目,另一个名为hostlink.activemq的项目,另一个名为hostlink.IbmMq的项目。后两者实现了在hostlink.interfaces项目上创建的接口。

那就是说,我需要在运行时选择我想要运行的实现。每个实现项目都有自己对特定于该实现的nuget包的引用。在interfaces项目中,我不想包含对实现项目的引用。我需要以某种方式在运行时获取引用。我知道下面发布的连接工厂选择器代码不起作用,因为我没有对接口上的实现的引用:

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 Framework为目标,因为该实现的4.x Framework没有nuget包,而另一个可以(并且应该)使用4.x Framework。我是否可以将界面项目定位到4.x框架,同时保留一个针对3.5 Framework的实现?或者它必须反过来,针对3.5 Framework的界面和针对4.0 Framework的实现之一?该接口没有任何特定的需要4.0 Framework。

我不熟悉Visual Studio语言,在java中我会使用像Spring这样的注入框架并在运行时注入引用。

1 个答案:

答案 0 :(得分:1)

除了使用注释中提到的依赖注入框架之外,您还可以使用Activator.CreateInstance加载给定名称和包含程序集名称的类型。

关于问题2,我将接口放在它自己的项目中,这样你的实现和主程序都可以引用接口而不需要相互引用。如果接口是由.NET 3.5项目引用的,那么它不能高于.NET 3.5本身。