autofac, ASP.NET интеграция и HttpRequestScoped
Вопрос
Ранее я задавал вопрос здесь о том, что autofac не удаляет мои объекты после завершения HTTP-запроса.Теперь я думаю, что у меня проблема посерьезнее, потому что есть доказательства того, что он обслуживает один и ТОТ ЖЕ объект от запроса к запросу.Опять же, я использую их инструкции здесь.Мой тест немного сложнее, потому что я использую синтаксис делегирования для создания объекта, но я думаю, что я помечаю его для времени жизни запроса.Глобальный.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;
Мое намерение здесь состоит в том, чтобы зарегистрировать IDBConnectionSelector, чтобы получить конкретный тип CachingDBConnections, созданный с помощью пользовательского конструктора, но с областью действия HTTP-запроса.
Некоторые методы объекта CachingDBConnections не работают при последующих запросах таким образом, что это наводит меня на мысль, что я получаю тот же метод, что и в прошлый раз, а не НОВЫЙ для каждого запроса.
Есть ли в этом смысл?Что я делаю не так?
Решение 2
Я понял это!
Я запрашивал НЕПРАВИЛЬНЫЙ контейнер для экземпляра объекта - я запрашивал контейнер-приложение для объекта, а не контейнер-запрос.
Д'о!
Другие советы
В большинстве случаев, когда это происходит (в любом контейнере IoC), вы обнаружите, что один компонент в цепочке зависимостей является синглтоном.
Например.
A -> B -> C
Если A - это 'factory', B - это 'singleton', а C - 'factory', то при разрешении A будет получена ссылка на singleton B, которая всегда будет ссылаться на один и тот же C.
Для того чтобы новый C создавался каждый раз, когда вы разрешаете A, B также должен быть "заводским".
Каково мое предположение?В этом ли проблема?
Ник