我有以下代码。我有两个不同的工作,它们调用下面提到的处理器类。这两项工作几乎完全相同,但只有在最后一步才会有所不同。目前,我正在基于布尔变量'createReport'处理它。我想将90%的通用功能提取到一个类中。设计模式:提取常见功能
我想过模板模式。但是,我如何将repositoryA的依赖注入抽象类?
Imports log4net
Imports System
Imports System.Collections.Generic
Public Interface IProcessor
Sub Process(path As String, includeCache As Boolean, createReport As Boolean)
End Interface
Public Class Processor
Implements IProcessor
Private ReadOnly _repositoryA As IRepositoryA
Private ReadOnly _repositoryB As IRepositoryB
Private ReadOnly _logger As ILog
Public Sub New(repositoryA As IRepositoryA, repositoryB As IRepositoryB, logger As ILog)
If repositoryA Is Nothing Then
Throw New ArgumentNullException("repositoryA")
End If
If repositoryB Is Nothing Then
Throw New ArgumentNullException("repositoryB")
End If
If logger Is Nothing Then
Throw New ArgumentNullException("logger")
End If
_repositoryA = repositoryA
_repositoryB = repositoryB
_logger = logger
End Sub
Public Sub Process(folderPaths As String, includeCache As Boolean, createReport As Boolean) Implements IProcessor.Process
_logger.Info("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
If String.IsNullOrEmpty(folderPaths) Then
Throw New ArgumentNullException("folderPaths")
End If
Dim paths() As String = folderPaths.Split(New Char() {";"c})
For Each path As String In paths
Dim cList As List(Of Container) = _repositoryA.GetContainers(path, includeCache)
For Each container As Container In cList
If Not container.IsDeleted Then
Dim assetList As List(Of Asset) = _repositoryA.GetAssets(container.ContainerID)
If Not assetList Is Nothing Then
For Each asset As Asset In assetList
ProcessAsset(asset, createReport)
Next
End If
End If
Next
Next
_logger.Info("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
End Sub
Private Sub ProcessAsset(asset As Asset, createReport As Boolean)
'Again some common business logic
'at last depending on value of createReport
If createReport Then
CreateReport(asset)
Else
SyncAsset(asset, ...other arguments)
End If
End Sub
Private Sub SyncAsset(asset As asset, ..other arguments)
'business logic. Dependency on _repositoryB here
End Sub
Private Sub CreateReport(asset As asset)
'business logic
End Sub
End Class
感谢您的帮助提前
问候, Suyog
请使用语法高亮显示 – 2014-09-04 18:51:40
我没有看到问题。模板方法听起来像一个合理的方法。什么阻止你在抽象类中定义存储库变量? – 2014-09-05 07:23:44