我有一个标准的基于StructureMap的ControllerFactory设置,我有各种依赖项的控制器,每个依赖项都具有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。
答案 0 :(得分:0)
您发布的代码是正确的,您应该在整个请求中获取相同的IRepository实例。必须有其他事情没有包含在你的问题中......