Autofac, ASP.NET Integração e descarte
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?
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).