【问题标题】:Best vb.net design pattern for switching between 2 com objects在 2 个 com 对象之间切换的最佳 vb.net 设计模式
【发布时间】:2012-08-06 18:18:45
【问题描述】:

挑战在于提出最佳的 vb.net 设计模式,该模式将允许在 2 个不同的大型机之间切换访问 com 对象。这一切当然不需要改变业务逻辑。

到目前为止,我想出的是一种工厂类型的方法(请参阅下面的精简伪代码)。我有 2 个基于枚举开关实例化的类,它们具有相同的方法和属性,但具有不同的底层对象特定方法。

我是在正确的轨道上还是应该采取其他方法?谢谢你的帮助。

Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Private MFA as MFSession = New MFSession(Enums.mfaccesstype.type1)
Private Sub Form1_Load()
    MFA.GotoScreen("XYZ")
End Sub
End Class

Public Class MFSession
Private SystemAccess As Object
End Property
Sub New(ByVal AccessType As Enums.mfaccesstype)
    Select Case AccessType
        Case Enums.mfaccesstype.type1
            SystemAccess = New AccessType1()
        Case Enums.mfaccesstype.type2
            SystemAccess = New AccessType2()
    End Select
End Sub

Public Sub GotoScreen(ByVal ScreenName As String, Optional ByVal Window As String = "")
    SystemAccess.GoToScreen(ScreenName)
End Sub
End Class

Public Class AccessType1
Private Type1Object As Object = CreateObject("comobj.Type1Object")

Sub New()
    'new session housekeeping
End Sub

Public Sub GotoScreen(ByVal ScreenName As String)
    'specialize Type1 method for going to 'ScreenName' here
End Sub

End Class


Public Class AccessType2
Private Type2Object As Object = CreateObject("comobj.Type2Object")

Sub New()
    'new session housekeeping
End Sub

Public Sub GotoScreen(ByVal ScreenName As String)
    'specialized Type2 method for going to 'ScreenName' here
End Sub
End Class

【问题讨论】:

    标签: .net vb.net design-patterns


    【解决方案1】:

    你很接近。

    先定义通用接口:

    Public Interface ISession 'could be abstract class instead if there is common code you'd like to share between the subclasses
    
       Sub GotoScreen(ByVal ScreenName As String) 
    
    End Interface
    

    其次,定义子类:

    Public Class Type1Session Implements ISession
    
       Private innerComObj As SomeComObject
    
       Public Sub GotoScreen(ByVal ScreenName As String)
          'type1-specific code using innerComObj
       End Sub 
    
    End Class
    
    Public Class Type2Session Implements ISession
    
       Private anotherComObj As SomeOtherComObject
    
       Public Sub GotoScreen(ByVal ScreenName As String)
          'type2-specific code using anotherComObj
       End Sub 
    
    End Class
    

    然后您可以创建一个工厂,该工厂将接受枚举或其他参数并返回具体的 Type1Session 或 Type1Session。

    这可以在专门的课程中完成:

    Public Class SessionFactory
    
       Public CreateSession(criteria) As ISession 
          'select case against your enum or whatever to create and return the specific type
       End Sub
    
    End Class
    

    如果您选择抽象(VB 中的 MustOverride)类而不是接口,则将工厂方法放在超类中也是一种先决条件。

    最后,COM 是关于接口的,所以如果您可以控制 COM 组件源,您可以让它们直接实现通用接口。

    【讨论】:

    • SessionFactory 和/或 CreateSession 方法也可以定义为Shared。在简单的情况下,这是我推荐的。
    • 感谢您的帮助。在单独的工厂中创建会话有什么好处?
    • ISession(在您的情况下为 Form1)的使用者应该尽可能不知道它是如何创建以促进松散耦合的。这样,例如,如果您添加第三种类型的 Session 实现,您可以这样做而不影响使用 ISession 实例的代码。通常也使用这种方法进行测试。想象一个只返回模拟数据或包含额外日志记录的 ISession 实现。这一切都可以使用单独的工厂对象最轻松地启用。
    • 说了这么多,要务实。如果您的用例非常简单,那么您可以将其设为工厂方法。随着复杂性的增加,只要愿意将其提升为专用对象即可。
    • 好吧,我画的很慢,但你的例子没有我的 MFSession 类。我故意这样做,以便智能感知向开发人员显示方法和属性。对此有什么建议吗?再次感谢您的帮助。
    猜你喜欢
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多