J'ai un projet Asp.net Core avec une DI par défaut. Donc j'obtiens des instances de services BL, des référentiels, des contextes EF par DI. J'ai une méthode abstraite qui renvoie un certain type par paramètre.Comment refactoriser la méthode abstraite à DI
IDocumentPreprocessor CreateDocumentPreprocessor(DocType docType)
{
switch (docType)
{
case DocType.Txt:
return new TxtPreprocessor(_context, _docRepository);
case DocType.Doc:
return new DocPreprocessor(_docRepository);
default:
throw new ...
}
}
Je n'aime pas ici la création directe d'instance par "new". Mais je ne suis pas sûr s'il est possible de passer cette logique à DI. Donc la question - comment le refactoriser à l'utilisation DI?
À un certain point, si OP souhaite un nouveau 'DocType', tel que« DocType.Pdf », une modification ne sera-t-elle pas requise dans la classe 'DocumentPreprocessorFactory'? Bien qu'il soit relativement simple d'ajouter le nouveau type, ne viole-t-il pas le principe Open Closed pour modifier la classe 'DocumentPreprocessorFactory' afin d'inclure la nouvelle logique d'ajout de la fonctionnalité Pdf? Pareil si OP veut finalement 'DocType.Xml', etc? –
@ mike-maurer, vous avez absolument raison. Mais refactoriser le bloc 'switch' de l'OP pour qu'il soit ouvert-fermé est une toute autre histoire. –
intéressant. Je serais curieux de voir s'il y a une implémentation qui résout cela sans violer les principes SOLID. –