我刚刚完成了Mark Seemann的书Dependency Injection in .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
}
这似乎是这里建议的方法,但是这样会实例化所有三个恢复器,而只需要一个? 如果我有20种不同的具体实现呢?
我觉得我应该为每种类型的恢复器实现一个具体工厂并返回它,但那样我只是用另一个new
替换了一个。
重构的最佳方式是什么?
ArchiveRestorer
子类时实例化所有子类。除非我漏掉了什么,如果我注入它们或者使用组合模式,所有三个子类都会被实例化。 - shamp00