Acabo de terminar el libro inyección de dependencias de Mark Seemann en .NET y ahora estoy tratando de refactorizar algún código heredado. (En este momento, no estoy confiando en ningún contenedor DI particular, sino simplemente intentando mover todas las dependencias a un lugar).¿Cómo aplico la inyección de dependencia a una fábrica abstracta
estoy mirando a la siguiente clase de fábrica que determina la ArchiveType
mediante la lectura de los primeros bytes del archivo con archiveReader.GetArchiveType()
y luego devuelve una instancia de un ArchiveRestorer
basado en la ArchiveType
enumeración.
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.");
}
}
}
¿Cómo refactorizar esto para que la clase no depende de los tipos de hormigón CurrentDataArchiveRestorer
, HistoricalDataArchiveRestorer
y AuditTrailArchiveRestorer
?
¿Debo mover los tres restauradores de hormigón al constructor de la fábrica?
public ArchiveRestorer Create(ArchiveReader archiveReader,
ArchiveRestorer currentDataArchiveRestorer,
ArchiveRestorer historicalDataArchiveRestorer,
ArchiveRestorer auditTrailDataArchiveRestorer)
{
// guard clauses...
// assign to readonly fields
}
Ese parece ser el enfoque sugerido here, pero luego se va a crear una instancia de los tres restauradores cuando hace falta un único? ¿Qué pasaría si tuviera 20 implementaciones concretas posibles diferentes en su lugar?
Siento que debería implementar una fábrica de concreto para cada tipo de restaurador y devolverlo en su lugar, pero entonces simplemente reemplazaría uno new
por otro.
¿Cuál es la mejor manera de refactorizar esto?
Creo que su escenario podría ser más adecuado para un patrón de cadena de responsabilidad. Mire [este ejemplo] (http://davidhayden.com/blog/dave/archive/2008/11/19/ChainResponsibilityDesignPatternUnityDependencyInjectionContainer.aspx) para el uso del patrón junto con un contenedor DI específico (Unity). –
No implementaría el registro y el montaje de la cadena de esa manera, pero definitivamente es un enfoque válido. –
Además del uso (¿redundante?) De un 'enum', ¿qué le preocupa particularmente sobre su implementación actual? –