有没有办法为每个forwared类型设置不同的生命周期?

时间:2014-06-26 20:55:18

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

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

ASP.NET vNext' s 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测试套件正在通过。这可以在Castle Windsor得到支持吗?

1 个答案:

答案 0 :(得分:0)

在温莎城堡中,您也可以多次注册相同的实施类型。 E.g。

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。但是,如果你想为你的界面提供不同的生活方式,这就不再是真实的了,无论如何你都会回到原来的位置。