1

Je souhaite créer une classe Facade pour gérer quelques opérations sur deux services. Pour contacter ces services, j'ai des classes proxy. Ayant un proxy abstrait et un proxy dérivé par service - comment puis-je créer cette partie de l'architecture, pour éviter la résolution dans Facade?Façade avec deux services à l'intérieur et injection de dépendances - approche de modèle de conception

class Facade 
{ 
    private Proxy proxy1; 
    private Proxy proxy2; 

    public Facade() 
    { 
     //I don't like this part 
     proxy1 = ...Resolve<Proxy1Type>(); 
     proxy2 = ...Resolve<Proxy2Type>(); 
    } 


    public void Do() 
    { 
     proxy1.Call(); 
     proxy2.Call(); 
    } 
} 

    abstract class Proxy {public void Call();} 
    class Proxy1Type : Proxy {public void override Call(){}} 
    class Proxy2Type : Proxy {public void override Call(){}} 

Quel motif de conception dois-je utiliser pour réparer ce cas?

EDIT

En option je devrais aller dans cette solution, mais ne l'aime pas beaucoup

class Facade 
{ 
    private IProxy proxy1; 
    private IProxy proxy2; 

    //I feel it's still wrong 
    public Facade(IProxy1Type p1, IProxy2Type p2) 
    { 
     proxy1 = p1; 
     proxy2 = p2; 
    } 


    public void Do() 
    { 
     proxy1.Call(); 
     proxy2.Call(); 
    } 
} 
interface IProxy { void Call();} 
interface IProxy1Type : IProxy{} 
interface IProxy2Type : IProxy {} 
class Proxy1Type : IProxy1Type { public void Call() { } } 
class Proxy2Type : IProxy2Type { public void Call() { } } 

Répondre

1

Il existe deux approches opposées et que vous les apparaissent à la fois dans la question. Vous pouvez soit résoudre dépendances à l'intérieur d'une classe en utilisant Service Locator (premier exemple) ou injecter les de l'extérieur en utilisant Dependency Injection.

injection de dépendances (constructor injection dans votre cas) a obtenu quelques avantages:

  1. Il est plus clair ce qui est nécessaire pour le faire fonctionner correctement la classe Facade puisque vous n'avez pas besoin de creuser dans la classe pour savoir ce que ça va essayer de résoudre (et quand).
  2. Il est plus facile de tester la classe Facade car vous pouvez injecter des doubles de test via le constructeur; il n'est pas nécessaire de configurer un conteneur DI dans les tests unitaires.

Vous pouvez en savoir plus sur Service Locator (et pourquoi vous devriez éviter de l'utiliser) dans this post.