【问题标题】:How to make AutoFac use same instance of nested dependency per top-level object? (SignalR dependency injection per hub)如何使 AutoFac 对每个顶级对象使用相同的嵌套依赖项实例? (每个集线器的 SignalR 依赖注入)
【发布时间】:2014-09-04 16:35:50
【问题描述】:

我正在尝试设置我的 AutoFac 注册,以使该测试通过:

[Test]
public void Autofac_registration_test()
{
    // Given
    var builder = new ContainerBuilder();
    RegisterServices(builder);
    var container = builder.Build();

    // When
    var firstHub = container.Resolve<Hub>();
    var secondHub = container.Resolve<Hub>();

    // Then
    firstHub.Should().NotBe(secondHub);
    firstHub.FooRepo.Context.Should().Be(firstHub.BarRepo.Context);
    firstHub.FooRepo.Context.Should().NotBe(secondHub.FooRepo.Context);
}

即我想在单个Hub 中一直使用相同的Context 对象,但在创建新的Hub 时使用不同的对象。

RegisterServices 目前只是:

private void RegisterServices(ContainerBuilder builder)
{
    builder.RegisterType<MyHub>();
    builder.RegisterType<FooRepo>();
    builder.RegisterType<BarRepo>();
    builder.RegisterType<Context>(); // How should I scope this?
}

firstHub.FooRepo.Context.Should().Be(firstHub.BarRepo.Context); 失败,因为Context 是临时作用域。

但每个生命周期的上下文范围也失败了,这次是firstHub.FooRepo.Context.Should().NotBe(secondHub.FooRepo.Context);

感觉这是一件合理的事情,所以我在这里遗漏了任何明显的开箱即用的东西吗? 还是我必须手动跟踪Hub 的创建?

(对于上下文,这是针对 SignalR 应用程序。集线器是根据 SignalR 请求创建的,因此这是在正常 webby 情况下尝试匹配 HTTP 请求的工作单元生命周期)。

【问题讨论】:

  • 另外,我还没有完全嫁给 AutoFac。如果有另一个依赖注入框架可以优雅地处理这个问题,那也很好!
  • 部分答案:它可能会涉及命名的生命周期范围。这个答案可能有足够的信息让你继续前进:stackoverflow.com/a/16820778/540663
  • 您正在寻找的是 per-object-graph 生活方式,这是很多容器都不支持的。 AFAIK Autofac 也没有。处理这个问题的常用方法是开始一个新的生命周期范围 A @JimBolla 说。

标签: c# dependency-injection signalr autofac signalr-hub


【解决方案1】:

@Steven 在他的评论中所说的是正确的,我需要一种基于对象图的生活方式。

Castle.Windsor 支持这一点,所以我决定将它用于我的依赖注入而不是 AutoFac。注册现在看起来像:

container.Register(Component.For<Hub>().LifestyleTransient());
container.Register(Component.For<FooRepo>().LifestyleTransient());
container.Register(Component.For<BarRepo>().LifestyleTransient());
container.Register(Component.For<Context>().LifestyleBoundTo<Hub>()); // Important bit

欲了解更多信息,请参阅:http://docs.castleproject.org/Windsor.LifeStyles.ashx?HL=scope#Bound_8

【讨论】:

    猜你喜欢
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    相关资源
    最近更新 更多