Я только что закончил книгу Марка Симанна Внедрение зависимостей в .NET , и сейчас я пытаюсь реорганизовать какой-то устаревший код. (На данном этапе я не полагаюсь на какой-либо конкретный DI-контейнер, а просто пытаюсь переместить все зависимости в одно место).
Я смотрю на следующий фабричный класс, который определяет ArchiveType
, читая первые несколько байтов архива с archiveReader.GetArchiveType()
, а затем возвращает экземпляр ArchiveRestorer
на основе перечисления ArchiveType
.
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
другим.
Каков наилучший способ рефакторинга?