Вопрос

Ранее я задавал вопрос здесь о том, что 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 также должен быть "заводским".

Каково мое предположение?В этом ли проблема?

Ник

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top