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

次に、2 つの異なるインスタンスを取得します。ただし、代わりに登録を使用すると

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

それから私Object.ReferenceEquals(fakeService, reallyFakeService);は今戻ってきtrueます。ただし、インターフェイスに異なるライフスタイルが必要な場合、これは真実ではなくなり、とにかく複数の登録を行っていた場所に戻ります.

于 2015-02-10T11:44:22.023 に答える