2010-11-24 3 views
1

Ceci est probablement une question stupide, mais les délégués ou les événements peuvent-ils être enregistrés avec un conteneur du CIO (par exemple Windsor)?Les délégués peuvent-ils être enregistrés avec le conteneur Castle Windsor IOC?

Je prévois d'enregistrer la fonctionnalité d'événement au moment du démarrage de l'application, en implémentant le modèle de stratégie.

Une alternative serait de simplement emballer tous les délégués dans les types pour l'enregistrement avec le conteneur, je présume.

Répondre

7

Pas besoin d'envelopper ou de sous-classer des fonctions pour les enregistrer à Windsor. Ils fonctionnent comme n'importe quel autre composant. Si vous devez en indiquer un Func<int>, utilisez des composants nommés et des remplacements de service, comme avec tout autre composant. Exemple:

[Test] 
public void Example() { 
    var container = new DefaultKernel(); 
    container.Register(Component.For<Func<int>>().Instance(() => 42).Named("42")); 
    container.Register(Component.For<Func<int>>().Instance(() => 44).Named("44")); 
    container.Register(Component.For<Something>().DependsOn(ServiceOverride.ForKey("f").Eq("44"))); 
    var s = container.Resolve<Something>(); 
    Assert.AreEqual(44, s.I); 
} 

class Something { 
    private readonly int i; 
    public Something(Func<int> f) { 
     i = f(); 
    } 

    public int I { 
     get { return i; } 
    } 
} 

Si vous cherchez à découpler vos enregistrements d'événements en utilisant le conteneur, il suffit d'utiliser le Event wiring facility.

+0

Merci beaucoup pour cela. Cela semble être une installation puissante. – Ben

0

Je dirais que ce n'est pas possible car comment résoudre la dépendance?

Si une classe demande un délégué de type Func<bool>, comment distingueriez-vous les différents délégués? Votre solution d'envelopper le délégué serait la meilleure solution, car elle vous permet de nommer et de combiner les délégués en sections fonctionnelles.

EDIT Il s'avère que Castle Windsor a un moyen de nommer les instances telles qu'elles sont enregistrées dans le CIO. Donc c'est possible, mais vous devez toujours donner un nom à chaque instance. Voir answer de Mauricio Scheffer.

+0

Bon point concernant la résolution. Je vais aller avec l'emballage des délégués. Serait propre si vous pouviez passer autour des fonctions nommées comme vous le faites des types nommés. – Ben

+0

Vous pouvez toujours nommer vos délégués en les sous-classant, c'est-à-dire en classe publique MyDelegate: Func {} –

+0

-1 cela * est * possible en utilisant les mécanismes standards de Windsor. –

0

Comme indiqué, cela fonctionne très bien, soyez prudent si vous utilisez le typed factory facility car il peut présenter un comportement inattendu. Vos dépendances de délégué peuvent engendrer la création d'usines proxy. Voir this question.

Questions connexes