我剛剛完成了Mark Seemann的書.NET中的依賴注入我正試圖重構一些遺留代碼。 (在這個階段,我不是依靠任何特定的DI容器,而只是試圖將所有的依賴移動到一個地方)。如何將依賴注入應用到抽象工廠
我在看下面的工廠類通過讀與archiveReader.GetArchiveType()
歸檔的前幾個字節確定ArchiveType
,然後返回基於ArchiveType
枚舉的ArchiveRestorer
的實例。
public class ArchiveRestorerFactory : IArchiveRestorerFactory
{
public ArchiveRestorer Create(ArchiveReader archiveReader)
{
ArchiveType type = archiveReader.GetArchiveType();
switch (type)
{
case ArchiveType.CurrentData:
return new CurrentDataArchiveRestorer(archiveReader);
break;
case ArchiveType.HistoricalData:
return new HistoricalDataArchiveRestorer(archiveReader);
break;
case ArchiveType.AuditTrail:
return new AuditTrailArchiveRestorer(archiveReader);
break;
default:
throw new Exception("ArchiveRestorerFactory error: Unknown value for ArchiveType.");
}
}
}
如何重構這使得類不依賴於具體的類型CurrentDataArchiveRestorer
,HistoricalDataArchiveRestorer
和AuditTrailArchiveRestorer
?
我應該將三個混凝土恢復器移到工廠的構造器中嗎?
public ArchiveRestorer Create(ArchiveReader archiveReader,
ArchiveRestorer currentDataArchiveRestorer,
ArchiveRestorer historicalDataArchiveRestorer,
ArchiveRestorer auditTrailDataArchiveRestorer)
{
// guard clauses...
// assign to readonly fields
}
這似乎是提出這一方法here,但隨後將實例所有三個修復者時,只需要一個?如果我有20種不同的可能的具體實現呢?
我覺得我應該爲每種類型的恢復器實施一個混凝土工廠,然後將其替換爲一個new
。
什麼是重構這個最好的方法?
我認爲你的情況可能更適合於責任鏈模式。查看[此示例](http://davidhayden.com/blog/dave/archive/2008/11/19/ChainResponsibilityDesignPatternUnityDependencyInjectionContainer.aspx),瞭解與特定DI容器(Unity)結合使用模式的情況。 – 2012-02-02 18:19:31
我不會以這種方式實現鏈的註冊和組裝,但它絕對是一種有效的方法。 – 2012-02-02 18:52:37
除了(多餘的)使用'enum',你目前的實現有什麼特別的麻煩? – 2012-02-02 21:09:09