У меня есть стандартная настройка 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.