【问题标题】:Is there a way to set different lifecycle for each forwared type?有没有办法为每种转发类型设置不同的生命周期?
【发布时间】:2014-08-17 20:53:00
【问题描述】:

Castle Windsor 不允许包含重复实现类型的注册。它允许type forwarding,这意味着您可以将实现类型映射到多个服务类型,只要您注册一次即可。

ASP.NET vNext 的Dependency Injection 库要求为多个服务类型注册相同的实现类型。但是,这些服务类型也有不同的生命周期,如 here 所示。

public static IEnumerable<IServiceDescriptor> DefaultServices()
{
    var describer = new ServiceDescriber();

    yield return describer.Transient<IFakeService, FakeService>();
    yield return describer.Scoped<IFakeScopedService, FakeService>();
    yield return describer.Singleton<IFakeSingletonService, FakeService>();
    yield return describer.Transient<IFakeFallbackService, FakeService>();
}

这是Forward 方法签名:

public ComponentRegistration<TService> Forward(params Type[] types)

如您所见,它不接受生命周期参数。 Ninject 测试套件正在通过。温莎城堡也可以支持吗?

【问题讨论】:

    标签: c# dependency-injection castle-windsor asp.net-core


    【解决方案1】:

    在 Castle Windsor 中,您也可以简单地多次注册相同的实现类型。例如

    container.Register(
        Component.For<IFakeService>().ImplementedBy<FakeService>(),
        Component.For<IReallyFakeService>().ImplementedBy<FakeService>());
    

    我认为,如果您想要不同的生活方式,那么转发类型的整个概念就不再有意义,因为转发背后的想法是您为注册 TypeA 的每个接口返回相同的 TypeA 实例。

    例如,如果我跑了上面的注册,我给出了

    var fakeService = container.Resolve<IFakeService>();
    var reallyFakeService = container.Resolve<IReallyFakeService>();
    
    Object.ReferenceEquals(fakeService, reallyFakeService);// => False
    

    然后我得到两个不同的实例。但是,如果我改为使用注册

    container.Register(
        Component
            .For<IFakeService>()
            .Forward<IReallyFakeService>()
            .ImplementedBy<FakeService>());
    

    那么我的Object.ReferenceEquals(fakeService, reallyFakeService); 现在将返回true。但是,如果您希望界面具有不同的生活方式,那么这将不再适用,并且无论如何您都会回到原来的位置,进行多次注册。

    【讨论】:

      猜你喜欢
      • 2022-07-22
      • 2021-09-08
      • 2021-02-19
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      相关资源
      最近更新 更多