Conteneur générique pour exposer des instances POCO à d'autres domaines d'application - comment ça marche?

StackOverflow https://stackoverflow.com/questions/806744

Question

Je suis intrigué par cette réponse d'un autre fil de responsable SO, et J'espérais que quelqu'un pourrait m'aider à faire la lumière sur le concept.

Disons que j'ai un AppDomain principal et un groupe d'enfants AppDomains, créés et initialisés par l'AppDomain principal. En pseudo-code:

Domaine principal d'application:

class Parent
{
    public void InitChildren(IList<ChildInfo> children)
    {
        foreach (var childInfo in children)
        {
            var ad = CreateNewChildAppDomain();
            var child = (Child)ad.CreateInstanceAndUnwrap(typeof(Child));
            child.Init(this);
        }
    }

    public void Register(BasePoco info)
    {
        // Do something with info.
    }
}

Child AppDomain:

class Child : MarshalByRefObject
{
    public void Init(Parent parent)
    {
        parent.Register(new Container<MyInfo>(new MyInfo()));
    }
}

class MyInfo : BasePoco // <- not a MarshalByRefObject!
{
    public MyInfo() { ... }
}

Au cours de Init (), un enfant AppDomain instancie un objet POCO, qui est non-marshalable par définition. Supposons également que nous ne pouvons pas le modifier à cet égard.

La réponse liée suggère que son encapsulation dans un Container<T> (qui est lui-même est marshalable) devrait permettre son renvoi à l'AppDomain principal. Je comprends cela car c’est le proxy vers Container<MyInfo> l’instance qui est vraiment transmise.

Ce que je ne comprends pas, c'est comment l'AppDomain principal peut éventuellement accéder à l'instance POCO du conteneur via le proxy du conteneur . Je vois l'opérateur de distribution implicite surchargé dans <=> et je comprends qu'il renvoie l'instance POCO contenue. Mais cette instance n'est pas proxy elle-même - elle est toujours dans l'enfant AppDomain! Alors, cette pause ne devrait-elle pas?

Que se passe-t-il vraiment ici?

Était-ce utile?

La solution

Dès que le conteneur renvoie l'instance résidant dans l'autre AppDomain (que ce soit via la propriété Value ou l'opérateur de conversion implicite), l'objet est organisé. S'il s'agit d'un MarshalByRefObject, un nouveau proxy sera généré afin que vous puissiez y accéder. Sinon, l'objet sera copié (organisé par valeur, sérialisé) dans le domaine d'application actuel.

La classe Container indiquée dans cette question ne peut vous aider que si vous souhaitez conserver un proxy pour un autre objet qui ne doit pas être organisé. Mais dans ce cas, vous ne devez pas accéder à la propriété Value ni utiliser l'opérateur de conversion implicite à partir de l'AppDomain où réside le proxy, car cela provoquerait un marshalement de l'objet dans le conteneur. Néanmoins, vous pouvez utiliser le conteneur comme argument dans une méthode sur un objet résidant dans le même objet AppDomain que l’objet Container, ce qui vous permet essentiellement de conserver une référence à un objet non marshallable (non sérialisable et non MarshalByRef, ou de type). dans un assemblage qui ne peut pas être chargé dans le répertoire AppDomain avec le proxy, etc.) et le transmettre comme un & "handle &";.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top