我刚刚完成了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