Autofac, ASP.NET Integration e HttPrequestscoped
Pergunta
Eu fiz uma pergunta anteriormente aqui Sobre o Autofac não descartar meus objetos quando a solicitação HTTP termina. Agora acho que tenho um problema maior, porque há evidências de que ele está servindo o mesmo pedido de solicitação de objeto. Novamente, estou usando suas instruções aqui. Meu teste é um pouco mais complexo, porque estou usando a sintaxe delegada para criar um objeto, mas acho que estou sinalizando-o para o pedido de solicitação. Global.asax.cs:
protected void Application_Start(object sender, EventArgs e)
{
...
var builder = new Autofac.Builder.ContainerBuilder();
builder.Register<IDBConnectionSelector>(
(c) => new CachingDBConnections(ConstructorArgs...))
.HttpRequestScoped();
var container = builder.Build();
_containerProvider = new ContainerProvider(container);
}
public IContainerProvider ContainerProvider
{
get { return _containerProvider; }
}
static IContainerProvider _containerProvider;
Minha intenção aqui é registrar o IDBConnectionSelector para criar o tipo de concreto CachingDBConnections com um construtor personalizado, mas com o escopo da solicitação HTTP.
Alguns métodos do objeto CachingDBConnections estão falhando nas solicitações subsequentes de uma maneira que me leva a acreditar que estou recebendo o mesmo que recebi da última vez e não uma nova para cada solicitação.
Isso faz sentido? O que estou fazendo errado?
Solução 2
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
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'.
Como está meu palpite? Este é o problema?
usuario