1

我正在使用工厂从实现相同通用接口的多个服务中进行选择。我的工厂是这样写的:

Public Class JurisdictionServiceFactory
    Private JurisdictionTypeMapper As Dictionary(Of String, Object)

    Sub New()
        JurisdictionTypeMapper = New Dictionary(Of String, Object)
        JurisdictionTypeMapper.Add("CountryJurisdiction", ProjectGlobals.UnityContainer.Resolve(Of IJurisdictionService(Of CountryJurisdiction)))
        JurisdictionTypeMapper.Add("StateJurisdiction", ProjectGlobals.UnityContainer.Resolve(Of IJurisdictionService(Of StateJurisdiction)))
        JurisdictionTypeMapper.Add("CountyJurisdiction", ProjectGlobals.UnityContainer.Resolve(Of IJurisdictionService(Of CountyJurisdiction)))
        JurisdictionTypeMapper.Add("CityJurisdiction", ProjectGlobals.UnityContainer.Resolve(Of IJurisdictionService(Of CityJurisdiction)))
        JurisdictionTypeMapper.Add("OtherJurisdiction", ProjectGlobals.UnityContainer.Resolve(Of IJurisdictionService(Of OtherJurisdiction)))
    End Sub

    Public Function getJurisdictionService(type As String) As Object
        Return JurisdictionTypeMapper(type)
    End Function
End Class

我想用允许编译器知道对象上存在哪些方法的东西替换“对象”作为值类型。例如,我希望能够使用自动完成功能。我试过这样做:Private JurisdictionTypeMapper As Dictionary(Of String, IJurisdictionService(Of )),但我只收到一条消息:“预期类型”。

这是 IJurisdictionService:

Public Interface IJurisdictionService(Of t)
    Inherits IDisposable

    Function GetJurisdictionsByCompany(companyId As Integer) As List(Of t)

    Sub AddJurisdiction(jurisdiction As t)
End Interface

这是一个示例实现:

Public Class CountryJurisdictionService
    Implements IJurisdictionService(Of CountryJurisdiction)

    Private jurisdictionRepository As IRepository(Of CountryJurisdiction)

    Public Sub New(jurisdictionRepository As IRepository(Of CountryJurisdiction))
        Me.jurisdictionRepository = jurisdictionRepository
    End Sub

    Public Sub AddJurisdiction(jurisdiction As CountryJurisdiction) Implements IJurisdictionService(Of CountryJurisdiction).AddJurisdiction
        jurisdictionRepository.Add(jurisdiction)
        jurisdictionRepository.Commit()
    End Sub

    Public Function GetJurisdictionsByCompany(companyId As Integer) As List(Of CountryJurisdiction) Implements IJurisdictionService(Of CountryJurisdiction).GetJurisdictionsByCompany
        Return jurisdictionRepository.GetMany(Function(j) j.CompanyID = companyId, False)
    End Function
End Class

编辑:这是工厂将用于的上下文:

Public Sub AddJurisdiction(jurisdiction)
        Using jurisdictionService = jurisdictionServiceFactory.getJurisdictionService(TypeName(jurisdiction))
            jurisdictionService.AddJurisdiction(jurisdiction)
        End Using
End Sub
4

1 回答 1

1

谁在呼唤getJurisdictionService?只要调用者知道他们要求什么类型,你就可以做这样的事情。

如何改变这个:

Public Function getJurisdictionService(type As String) As Object
    Return JurisdictionTypeMapper(type)
End Function

对此:

Public Function getJurisdictionService(Of T)() As IJurisdictionService(Of T)
    Return DirectCast(JurisdictionTypeMapper(GetType(T)), IJurisdictionService(Of T))
End Function

调用者这样做是为了获得强类型服务:

service = jurisdictionServiceFactory.getJurisdictionService(Of CountryJurisdictionService)()

当然,字典需要从类型而不是类名中删除:

Private JurisdictionTypeMapper As Dictionary(Of Type, Object)

编辑:

鉴于您提供的新细节,在这种情况下,我经常喜欢创建基类或父接口以在泛型类之间创建兄弟关系,即使这只是一些基于代码的文档:

Public Interface IJurisdictionService
    Inherits IDisposable

End Interface

Public Interface IJurisdictionService(Of t) 
    Inherits IJurisdictionService

    Function GetJurisdictionsByCompany(companyId As Integer) As List(Of t)

    Sub AddJurisdiction(jurisdiction As t)

End Interface

这也适用于 Jurisdiction 对象,它们可以使用父接口或基类:

Public Interface IJurisdictionService
End Interface

然后Private JurisdictionTypeMapper As Dictionary(Of String, Object)变成Private JurisdictionTypeMapper As Dictionary(Of String, IJurisdictionService)

于 2019-12-17T14:17:56.807 回答