Pergunta

Uma das bibliotecas que estamos usando para o nosso produto usa um singleton para acesso a ele. Tenho certeza de que ele é implementado como uma instância estática (não é open source). Isso funciona bem para um aplicativo de documento único, mas nosso aplicativo pode ter mais de um documento carregado. Estou assumindo acesso à instância está escrito algo assim:

Instance* getInstance() {
    static Instance* inst = new Instance();
    return inst;
}

Em situações como esta, existe alguma maneira de criar robustamente mais de uma instância? A única coisa que posso pensar é ter mais de processo e usar algum tipo de IPC para amarrá-lo todos juntos. Eu não consigo pensar em nada menos hacky.

Eu pedi o fornecedor para implementar algum tipo de token de sessão para que eu possa ter várias instâncias simultâneas, mas eles são grandes e nós somos pequenos.

Cory

Editar:

  • a máquina é uma máquina Windows
  • a estática global é basicamente uma grande fábrica. Eu quero um token de sessão de algum tipo para que eu possa facilmente dizer "liberar todos os recursos desta sessão" (não há nenhuma maneira de re-inicializar a estática globais que eu saiba)

Ao invés de tentar algumas travessuras desonestos para conseguir o que eu quero, eu vou quebrar a coisa toda com minha própria classe e adicionar uma chave de sessão para todos os getter. Internamente eu vou acompanhar o que foi alocado adicionar o meu próprio método de liberação de recursos de retorno. Este é abaixo do ideal por muitas razões, mas eu não consigo pensar em uma idéia melhor.

Obrigado a todos pelo grande feedback.

Foi útil?

Solução

A única coisa que eu posso pensar é a sub classe-lo se você é o suficiente sorte de ter a classe singleton definido como:

class Document {
public:
    static Document* getInstance() {
        static Document inst;
        return &inst;
    }
    virtual ~Document();
protected:
    Document();
private:
    struct Impl;
    Impl *pImpl;
};

Se você pode subclasse-lo e a subclasse terá acesso ao construtor, então você pode criar um instanceable subclasse como:

class MyDocument: public Document {
public:
    MyDocument(): Document() {
    }
};

Isto pode não ser completamente seguro, pois o implementador pode ter feito alguns pressupostos desagradáveis. Mas é uma idéia ou alguma abordagem que pode ter alguma chance de trabalhar. Com alguma sorte o fornecedor pode ser favorável a esta opção se você mencionou ... boa sorte.

Outras dicas

Mesmo se você fosse capaz de resolver esta questão em particular ao ter tudo acontecer em-proc, eu ficaria preocupado que esta questão Singleton é apenas a ponta do iceberg. A biblioteca, obviamente, não foi concebido para o seu cenário.

Isolando cada carregamento da DLL em seus próprios sons processo certo e não-hacky para mim, embora, naturalmente, pode ser caro para você.

Eu não posso ver uma falha no seu raciocínio infelizmente. O vendedor tomou uma decisão, e você é obrigado por ela. Ele decidiu sobre uma instância por processo, então se você quiser várias instâncias você deve ter múltiplos processos com tudo o que implica.

É claro que se você assumir que a sua decisão de restringir é arbitrária e que não há nenhuma boa razão para isso, você poderia tentar cortar em torno dele. A maneira de começar nesse caminho é fazer alguma desmontagem / montagem pisar no depurador. Se você pode confirmar que sua fábrica instância funciona exatamente como você concluiu acima, você poderia, sem dúvida, cortar juntos uma alternativa que permite a criação de várias instâncias.

Mas, claro, o enorme risco com esta abordagem é que cada linha de código na base de código do fornecedor que se baseia em sua decisão de ter uma única instância é então uma bomba relógio pronta para explodir em seu rosto. Esse código é invisível para você. Você está preparado para aposta há zero tais linhas? Eu sei o que Clint Eastwood diria em uma situação como esta; "Você sente o punk afortunado, bem não é?" : -)

Não há nenhuma maneira elegante de ter várias instâncias de um objeto singleton em um espaço de programa - mas isso é de propósito. Em geral, você só pode usar um singleton no caso em que não é desejável ter várias instâncias. Se o fornecedor implementou seu produto usando um singleton, pode haver boas razões para a escolha.

Talvez, se você descrever o problema mais detalhadamente, pode haver outras abordagens possíveis. É difícil dizer, com base nas informações fornecidas. O que faz o objeto singleton fazer? Por que você precisa de várias instâncias dele?

exceto para as coisas entre processos que você sugeriu, o melhor cortar que eu posso vir acima com é copiar a DLL para um novo arquivo e manualmente carregar o novo dll e importar todas as funções que você usa para cada instância que você criar.

espero que isto significa que as variáveis ??estáticas não conflito entre as diferentes instâncias, uma vez que não são tecnicamente na mesma DLL. No entanto, existem muitas coisas ruins com esta solução, como todo o código na dll sendo clonados para cada versão e você não vai ser capaz de usar uma biblioteca de importação, mas tem que carregar a DLL e importar todas as funções manualmente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top