【发布时间】:2011-07-29 19:56:05
【问题描述】:
目前我的代码具有以下属性:
Private _queueRetriever As Services.IQueueRetriever
Public ReadOnly Property QueueRetriever As Services.IQueueRetriever
Get
If _queueRetriever Is Nothing Then
RemotingSetup.RegisterHttpBinaryChannel()
_queueRetriever = RemotingFactory.CreateProxy(Of Services.IQueueRetriever)(Options.DevLocal)
End If
Return _queueRetriever
End Get
End Property
Private _queueCountRetriever As Services.IQueueCounter
Public ReadOnly Property QueueCounter As Services.IQueueCounter
Get
If _queueCountRetriever Is Nothing Then
RemotingSetup.RegisterHttpBinaryChannel()
_queueCountRetriever = RemotingFactory.CreateProxy(Of Services.IQueueCounter)(Options.DevLocal)
End If
Return _queueCountRetriever
End Get
End Property
如您所见,这两个属性的代码基本相同。只是种类不同。我在泛型方法方面不是很有经验,但我觉得我应该能够使用泛型使这段代码更DRY。可以做到吗?或者这不是泛型方法的工作?
编辑
基于 Marc 的回答,我想出了以下几点:
Protected Services As New Dictionary(Of Type, Object)
Protected Function CreateService(Of T)() As T
If Not Services.ContainsKey(GetType(T)) Then
RemotingSetup.RegisterHttpBinaryChannel()
Services.Add(GetType(T), RemotingFactory.CreateProxy(Of T)(Options.DevLocal))
End If
Return DirectCast(Services(GetType(T)), T)
End Function
当然可以这样使用:
Me.CreateService(Of IService).Foo()
【问题讨论】: