Wie zu lösen „MarshalByRefObject sein muss“ in einer guten, aber Mehrfachvererbung amputierte Sprache wie C #?

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

Frage

Wie in einer guten „MarshalByRefObject sein muss“ lösen, sondern Mehrfachvererbung amputierte Sprache wie C #?

Das Problem ist sehr einfach, in einigen Fällen einfach aus dieser Klasse (Anforderungen an die Infrastruktur) erben müssen. Es spielt keine Rolle, hier wirklich, die Fälle. Also, was tun Sie, wenn Sie bereits von einer anderen Klasse geerbt haben (Ihre Domain-Modell Anforderungen)?

Btw gutes Anwendungs-Frameworks, wie spring.net immer sicherstellen, dass Sie nicht von dieser Klasse zu erben haben, egal welche Art von Infrastruktur, die Sie auf Ihre Klasse anwenden müssen.

Ich möchte wissen, was ich bin immer -3 Stimmen hier ?? :)

War es hilfreich?

Lösung

In der Regel wollen Sie nur ein Objekt MarshalByRef machen, wenn du gehst, es in einem Remoting / WCF Kontext zu verwenden. Dies ist in der Regel ein Sonder genug Fall, dass es nicht ein Schmerz.

Angenommen, Sie eine allgemeine Art hatten, und wollte man daraus abzuleiten und spezialisieren, und dann entfernt die Art abgeleitet - jetzt Sie ein Problem haben, weil auf ein Objekt auslagern muß von MarshalByRefObject erbt, und Ihre ursprüngliche allgemeine Art tat es nicht. Angenommen, Sie können es nicht ändern, weil Sie binäre Vererbung tun, oder weil sie sich von einer Basisklasse ableitet können Sie nicht ändern? Da die Fragesteller darauf hinweisen, da C # (.NET und im Allgemeinen) MI nicht zulässt, kann man nicht von beiden erbt.

Die kurze Antwort ist, dass Sie Art-of verschraubt sind. Sie können entweder den allgemeinen Typen verändern von MarshalByRefObject (oder gehen weit genug oben in die Kette, die Sie es irgendwo wirksam einsetzen können) inhert, sonst können Sie darüber nachdenken, etwa mit Proxy-Objekten Ausmisten.

Sie könnte zum Beispiel eine Schnittstelle Vertrag erstellen, die Ihre Art der Schnittstelle beschreibt, und dann einen Proxy-Typ von MarshalByRefObject erben bauen, die auch die Schnittstelle von Komposition implementiert und Delegierung an eine Instanz des Typs (dh ein Wrapper). Sie könnten dann remote eine Instanz dieser Proxy-Typ, die Ihren Typ instanziiert würde und die Arbeit machen wie zu erwarten -. Aber alle Rückgabetypen von Methoden sein müssen [Serializable]

public interface IMyType
{
    string SayHello();
    string BaseTypeMethodIWantToUse();
}

public class MyType : MyBaseType, IMyType
{
    public string SayHello()
    {
        return "Hello!";
    }
}

public class MyRemoteableType : MarshalByRefObject, IMyType
{
    private MyType _instance = new MyType();

    public string SayHello()
    {
        return _instance.SayHello();
    }

    public string BaseTypeMethodIWantToUse()
    {
        return _instance.BaseTypeMethodIWantToUse();
    }
}

Es scheint wie eine Menge Arbeit, aber. Letztendlich würde ich, wenn Sie in diesem Szenario sind ein Redesign vorschlagen oder ein Umdenken.

Andere Tipps

Es hängt davon ab, wie man es brauchen. eine Basisklasse verwenden, die von MarshalByRefObject abgeleitet könnte es tun. Aggregation könnte es tun. Ohne ein konkreteres Beispiel dafür, was Sie brauchen, ist es schwer zu sagen ist, aber es ist ein seltener Fall, dass die Mehrfachvererbung ist die einzige Lösung für ein Problem sein würde.

Sie können nicht von mehreren Klassen erben. Daher muss man entweder (a) Ihre Vererbungshierarchie ändern, so dass die Basis von erbt, oder (b) schreiben Sie Ihre Anwendung unterschiedlich.

Ohne weitere Informationen über Warum müssen Sie von MarshalByRefObject erben oder warum Ihre Basisklasse nicht (nicht?), Dann ist es schwer, mehr konkrete Ratschläge zu geben.

Aber ich würde sagen, wenn Sie einen abgeleiteten Typen haben, die Semantik unterschiedliche Serialisieren zu seiner Basis braucht, dann haben Sie wahrscheinlich irgendwo ein architektonisches Problem bekommen.

„Also, was tun Sie, wenn Sie bereits von einer anderen Klasse geerbt haben (Ihre Domain-Modell Anforderungen)?“

Können Sie eine Basisklasse für das Stück Ihres Domain-Modell erstellen, das Erbe von MarshalByRefObject erfordert?

Ich hatte Erfolg mit einem generischen Ansatz. T muss nicht „MarshalByRefObject“ sein. Natürlich werden Sie „RemoteProcess“ mit dem Objekt ersetzen müssen Sie für Remoting verwenden. Dann können Sie Ihre nicht-MarshalByRefObject als RemotingHost.RemoteObject zugreifen zu können.

public class RemotingHost<T> : MarshalByRefObject where T: class
{
    RemoteProcess host;
    T remoteObject;
    public T RemoteObject { get { return remoteObject; } }

    public RemotingAdmin()
    {
        host = new RemoteProcess();
        remoteObject = (T)host.CreateObject(typeof(T));
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top