Pergunta

Autofac Newbie aqui, mas eu gosto do que vejo até agora. Estou tentando tirar proveito do pedido de solicitação dos meus objetos resolvidos e estou tendo problemas para confirmar que uma disposição está realmente acontecendo depois que uma solicitação é concluída.

Tenho um objeto descartável que recebo no início de uma solicitação de página e descarto no final. Estou usando o Autofac para obter uma instância do objeto agora e queria ver se o Autofac faria a disposição para mim.

Eu instrumentei o método DisponE () no objeto em questão, e posso vê -lo 'fogo' quando minha página faz o gerenciamento da vida. Não vejo evidências quando não me descarto, mas deixe o Autofac fazê -lo.

estou a usar esses Instruções para configurar os thignns, incluindo o web.config e as alterações global.asax. Sou capaz de instanciar o objeto muito bem, mas não sei dizer se ele está realmente sendo descartado. Existe outro passo?

Foi útil?

Solução 3

Eu descobri!

Eu estava pedindo ao contêiner errado a instância do objeto-eu estava pedindo ao Application-container o objeto e não o contador-contador.

D'HO!

Outras dicas

Se você descarta o objeto manualmente dentro da página ou permitir que o módulo Autofac o faça, haverá uma diferença quando seu objeto for descartado em relação ao ciclo de vida da solicitação. O Autofac ContainerDisposalModule não vou descarte o contêiner de solicitação, e com ele seu objeto, até que o httpApplication.endRequest seja disparado, que está no final do ciclo de vida da solicitação.

Dependendo de como você está rastreando a chamada para seus objetos, o método de disposição, pode haver a possibilidade de você não ver a saída. Como você está instrumentando seu método de disposição?

Repita de resposta do seu post novamente:

Na maioria das vezes, isso acontece (em qualquer contêiner do COI), você descobrirá que um componente ao longo de uma cadeia de dependências é um singleton.

Por exemplo

A -> B -> C

Se A for 'Factory', B é 'Singleton' e C é 'Factory', então resolver um receberá uma referência ao Singleton B, que sempre fará referência ao mesmo C.

Para que um novo C seja criado toda vez que você resolver A, B também deve ser 'fábrica'.

Dispone nada mais é do que uma interface que permite definir um método de "disposição". O uso mais comum para exigir uma classe descartável é se houver recursos nessa classe que devem ser libertados explicitamente (como um identificador de recursos do Windows). Na maioria das vezes, a interface idispotável não é necessária, pois o coletor de lixo é extremamente poderoso e fará um trabalho muito melhor no gerenciamento da memória. No entanto, obviamente, há muitos casos em que as alças devem ser libertadas imediatamente, o que me leva ao próximo ponto, a implementação do Idisposable.

O que não fazer:

var myClass = MyDisposableClass();

// do stuff with myClass

myClass.Dispose();


Proper usage:

using (var myClass = MyDisposableClass())
{
    // do stuff with myClass
}

O compilador construirá efetivamente o mesmo que o seguinte:

MyDisposableClass myClass = MyDisposableClass();
try
{
    // do stuff with myClass
}
finally
{
    myClass.Dispose();
}

A distinção importante é que, não importa o que aconteça, você sabe que sua disposição será chamada. Além disso, você pode amarrar um destruidor (que, se existe, é chamado pelo coletor de lixo) que você pode ligar para chamar seu método de disposição; Mas se você precisar fazer isso por qualquer motivo, não libere o mesmo recurso duas vezes (defina seus ponteiros como nulos após o lançamento).

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