Плагин, определенный с гибридным жизненным циклом, который создается несколько раз за HttpContext - PullRequest
0 голосов
/ 16 февраля 2011

У меня есть стандартная настройка ControllerFactory на основе StructureMap, и у меня есть контроллеры, которые имеют различные зависимости, каждая из которых имеет зависимость типа IRepository, например:

// "web" assembly
public StructureMapRegistry : Registry 
{
    public StructureMapRegistry()
    {
        Scan(scanner =>
                     {
                         scanner.AssemblyContainingType<WidgetController>();
                         scanner.AssemblyContainingType<Repository>();
                         scanner.WithDefaultConventions();
                     });

        For<IRepository>().HybridHttpOrThreadLocalScoped().Use<Repository>();
    }
}

public WidgetController(IService1 service1, IService2 service2, Service3 service3)
{
    // etc, etc
}

// "data" assembly
public Service1 : IService1
{
    public Service1(IRepository repository)
    {
        // etc, etc
    }
}

public Service2 : IService2
{
    public Service2(IRepository repository)
    {
        // etc, etc
    }
}

public Service3
{
    public Service3(IRepository repository)
    {
        // etc, etc
    }
}

Использование отладки и GetHashCode()и тому подобное, похоже, что в каждом из сервисов создается новый Repository, когда WidgetController, когда я ожидаю, что все они будут использовать один и тот же экземпляр.

Не понимаю ли я, что HybridHttpOrThreadLocalScoped() делает?Это потому, что я иногда передаю конкретные классы вместо интерфейсов в качестве зависимостей, как я делал с Service3 в приведенном выше коде (всегда используется IRepository, а не конкретный класс Repository)?Я просто полностью делаю это неправильно?

(Этот код явно был экстраполирован из фактического кода, поэтому я надеюсь, что я не пропустил никаких важных деталей.)

ПРИМЕЧАНИЕ: я используюStructureMap 2.6.1.

1 Ответ

0 голосов
/ 18 февраля 2011

Код, который вы разместили, верен, вы должны получать один и тот же экземпляр IRepository на протяжении всего вашего запроса. Должно быть что-то еще, что вы не включили в свой вопрос ...

...