2009-08-25 8 views
2

J'ai créé un service multithread qui utilise Castle Windsor pour créer des composants à exécuter sur des threads distincts. I Résoudre un composant par son nom avec des paramètres pour chaque thread.Puis-je demander à Castle Windsor de créer un composant dans un AppDomain distinct?

Je rencontre des problèmes de concurrence avec une bibliothèque tierce utilisée par les composants. Je suspecte qu'isoler ces composants dans AppDomains séparé résoudra le problème.

Existe-t-il un moyen pour que Resolve crée le composant en utilisant un AppDomain différent?

private ActivityThread NewActivityThread(ActivityInstance activityInstance) 
{ 
    // Set up the creation arguments. 
    System.Collections.IDictionary arguments = new Dictionary<string, string>(); 
    activityInstance.Parameters.ForEach(p => arguments.Add(p.Name, p.Value)); 

    // Get the activity handler from the container. 
    IActivity activity = Program.Container.Resolve<IActivity>(activityInstance.Name, arguments); 

    // Create a thread for the activity. 
    ActivityThread thread = new ActivityThread(activity, activityInstance, _nextActivityID++); 
    return thread; 
} 

public ActivityThread(IActivity activity, ActivityInstance instance, int id) 
{ 
    _activity = activity; 
    _instance = instance; 
    _id = id; 
} 

public void Start() 
{ 
    if (_thread == null) 
    { 
     // Create a new thread to run this activity. 
     _thread = new Thread(delegate() { _activity.Run(); }); 
     _thread.Name = _activity.ToString(); 
     _thread.SetApartmentState(ApartmentState.STA); 
     _thread.Start(); 
    } 
} 
+0

Êtes-vous sûr que vous voulez que les choses dans un autre * AppDomain *, au lieu d'une instance de composant par fil? (voir PerThread dans http://www.castleproject.org/container/documentation/trunk/usersguide/lifestyles.html) –

+0

J'essaie d'utiliser AppDomains pour isoler les composants potentiellement dangereux les uns des autres. Par exemple, on utilise une bibliothèque tierce qui instancie un objet COM. –

Répondre

1

Si vous avez déjà créé un AppDomain distinct, ne pouvez-vous pas simplement créer une nouvelle instance d'un conteneur Windsor dans le domaine AppDomain privé?

Questions connexes