【问题标题】:VB.NET select implementation out of an interface at runtimeVB.NET 在运行时从接口中选择实现
【发布时间】: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 这样的注入框架并在运行时注入引用。

【问题讨论】:

  • 在 .NET 中的操作与在 Java 中的操作基本相同,使用 CastleAutofac 等。
  • 控制模式的依赖注入或反转并不特定于任何特定的编程语言。而且Spring是一个通用的应用程序框架,不仅仅是做基于注入的设计
  • @Adyson,我知道 Spring 不仅仅是注入,我只是引用它以便人们知道我来自哪里

标签: vb.net interface


【解决方案1】:

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

关于问题 2,我会将接口放在它自己的项目中,以便您的实现和主程序可以各自引用该接口,而无需相互引用。如果接口被 .NET 3.5 项目引用,则不能高于 .NET 3.5 本身。

【讨论】:

  • 感谢PKing,我会使用这两个建议。我也不知道那个界面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多