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