2

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

ASP.NET vNext 的依赖注入库需要为多个服务类型注册相同的实现类型。但是,这些服务类型也有不同的生命周期,如此处所示。

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 测试套件正在通过。温莎城堡也可以支持吗?

4

1 回答 1

0

在 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的。但是,如果您希望界面具有不同的生活方式,这将不再适用,并且无论如何您都回到了多次注册的状态。

于 2015-02-10T11:44:22.023 回答