0

Alors, laisse supposer que je peux dessiner dans la peinture:Comment gérer ce scénario de résolution DI?

Horrible depiction of my problem

ai dis-je une classe A qui dépend des objets B et C être instanciés, mais C dépend également d'une instance de B, et je Je veux que cette instance de B soit la même que je passe à A. Comment puis-je accomplir cela?

Maintenant, vous ne l'avez probablement pas compris non plus; donc je vais aller de l'avant et de le transformer en code:

public class A 
{ 
    private readonly B b; 
    private readonly C c; 

    public A(B b, C c) 
    { 
     this.b = b; 
     this.c = c; 
    } 
} 

public class B 
{  
} 

public class C 
{ 
    private readonly B b; 

    public C(B b) 
    { 
     this.b = b; 
    } 
} 

Sans DI, je le résoudre comme ceci:

var b = new B(); 
var c = new C(b); 
var a = new A(b,c); 

Comment puis-je accomplir quelque chose comme ça par DI, proprement? Ce que je veux est assez simple: utiliser la même instance de B lors de l'instanciation à la fois C et A.

Oublié de mentionner que je le veux dans un mode de vie par demande web, pas singleton ou transitoire.

+1

Si vous fournissiez plus de contexte, donnez aux classes des noms plus significatifs, vous obtiendrez une meilleure réponse ... – xandercoded

+0

J'utilise castle, 'A' ->' Service', 'B' ->' Repository', 'C' ->' SupportClass' – bevacqua

+2

Ce que vous nous montrez est clairement DI. Vous voulez savoir comment configurer cela à Castle Windsor? Pouvez-vous mettre à jour votre question avec votre configuration actuelle? – Steven

Répondre

1

Selon le comportement castle documentation, singleton est déjà le comportement par défaut. Par conséquent, Castle créera une seule instance de B et la transmettra à la fois à A et à C.

Ce sont les cas où ne veulent pas qui vous intéressent. Vous avez besoin d'une configuration supplémentaire, comme décrit dans la documentation liée.

0

Je vois deux options. Un, utilisez votre conteneur pour gérer la durée de vie du class:

StructureMap Container, la portée IUnitOfWork à la HttpContext actuelle:

For<IUnitOfWork>().HttpContextScoped().Use<UnitOfWork>(); 

Cela garantit que toutes les demandes de IUnitOfWork, dans la même HttpContext, ont la même instance .

Option deux, factoriser votre code afin que vous n'aurez pas cette question ...

0

En supposant que vous voulez vraiment garder B en classe C non exposée, que diriez-vous:

class Program 
{ 
    static void Main(string[] args) 
    { 
    var b = new B(); 
    var c = new C(b); 
    var a = c.GetA(); 
    } 
} 

public class A 
{ 
    private readonly B b; 
    private readonly C c; 

    public abstract class AFactory 
    { 
    private B b; 

    public AFactory(B b) 
    { 
     this.b = b; 
    } 

    protected A GetA(C c) 
    { 
     return new A(b, c); 
    } 

    abstract public A GetA(); 
    } 

    private A(B b, C c) 
    { 
    this.b = b; 
    this.c = c; 
    } 
} 

public class B 
{ 
} 

public class C 
{ 
    private readonly B b; 
    private CAFactory afactory; 

    private class CAFactory : A.AFactory 
    { 
    private C c; 
    public CAFactory(C c) : base(c.b) 
    { 
     this.c = c; 
    } 

    public A GetA() 
    { 
     return GetA(c); 
    } 
    } 

    public C(B b) 
    { 
    this.b = b; 
    afactory = new CAFactory(this); 
    } 

    public A GetA() 
    { 
    return afactory.GetA(); 
    } 
} 
Questions connexes