Como resolver "Deve ser marshalbyRefobject" em uma linguagem amputada boa, mas múltipla de infusão, como C#?

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

Pergunta

Como resolver "Deve ser marshalbyRefobject" em uma linguagem amputada boa, mas múltipla de infusão, como C#?

O problema é muito simples, em vários casos, você só precisa herdar desta classe (requisitos de infraestrutura). Na verdade, não importa aqui, quais casos. Então, o que você faz se já herdou de outra classe (seus requisitos de modelo de domínio)?

BTW Boas estruturas de aplicativos, como Spring.net, sempre certifique -se de não ter que herdar desta classe, independentemente do tipo de infraestrutura que você precisa aplicar à sua classe.

Eu gostaria de saber o que estou recebendo -3 votos aqui? :)

Foi útil?

Solução

Em geral, você só deseja fazer um objeto Marshalbyref se quiser usá -lo em um contexto remoto / WCF. Este geralmente é um caso especial o suficiente de que não é uma dor.

Suponha que você tivesse um tipo geral, e quis derivar e especializá -lo, e depois remote o tipo derivado - agora você tem um problema, porque para ser remoto um objeto deve herdar do marechalbyRefobject, e seu tipo geral original não . Suponha que você não possa alterá -lo porque está fazendo herança binária, ou porque ela própria deriva de uma classe base que você não pode mudar? Como o questionador aponta, como C# (e .NET em geral) não permite o MI, você não pode herdar de ambos.

A resposta curta é que você está meio que ferrado. Você altera o tipo geral para ingerir do MarshalbyRefobject (ou vai longe o suficiente na cadeia que você pode inseri -la em algum lugar eficaz), ou então você pode pensar em mexer com objetos proxy.

Você pode, por exemplo, criar um contrato de interface que descreva a interface do seu tipo e, em seguida, construir um tipo de proxy herdando a partir do marshalbyRefobject que também implementa essa interface por composição e delegação a uma instância do seu tipo (ou seja, um invólucro). Você pode remotar uma instância desse tipo de proxy que instanciaria seu tipo e faria o trabalho conforme o esperado - mas todos os tipos de retorno dos métodos devem ser [serializáveis].

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();
    }
}

Parece muito trabalho, no entanto. Em última análise, se você estiver nesse cenário, eu sugeriria um repouso ou um repensar.

Outras dicas

Depende de como você precisa conseguir isso. Usar uma classe base que deriva do MarshalbyRefobject pode fazê -lo. A agregação pode fazer isso. Sem um exemplo mais concreto do que você precisa, é difícil dizer, mas é um caso raro que a herança múltipla seria a única solução para um problema.

Você não pode herdar de várias classes. Portanto, você precisa (a) alterar sua hierarquia de herança para que a base herda dela ou (b) escreva seu aplicativo de maneira diferente.

Sem mais informações sobre Por quê você precisa herdar de MarshalByRefObject Ou por que sua classe base não (não pode?), É difícil dar mais conselhos concretos.

Mas eu diria que se você tiver um tipo derivado que precisa de diferentes semânticas de marechaling em sua base, provavelmente tem um problema de arquitetura em algum lugar.

"Então, o que você faz se já herdou de outra classe (seus requisitos de modelo de domínio)?"

Você pode criar uma classe base para a parte do seu modelo de domínio que requer herança do MarshalbyRefobject?

Eu tive sucesso com uma abordagem genérica. T não precisa ser "marshalbyRefobject". É claro que você terá que substituir o "RemoteProcess" pelo objeto que você usa para remoção. Em seguida, você pode acessar seu não-marshalbyRefobject como remotinghost.remoteObject.

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));
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top