1

Castle Windsor でパラメーター化されたインスタンスを作成しようとすると、ジェネリック引数を渡すことに問題があるようです

ジェネリック引数を渡さないデモ

    private static void Main(string[] args)
    {
        PassGenericParamAtResolutionTime();
        Console.ReadLine();
    }

    private static void PassGenericParamAtResolutionTime()
    {
        Console.WriteLine("Passing generic argument fails");
        var container = new WindsorContainer();
        container.Register(Component.For<ISandCoordinator<Simpleton>>()
                           .ImplementedBy<SandCoordinator<Simpleton>>());
        var runtimeConstructorParam = new GenericManager<Simpleton>(
                                          "This Id Does Not Get Through");
        var runtimeArguments = new Arguments(
                                   new object[] {runtimeConstructorParam});
        var shouldBeParameterizedCoordinator = container
                   .Resolve<ISandCoordinator<Simpleton>>(runtimeArguments);
        Console.WriteLine(shouldBeParameterizedCoordinator.Log);
    }

コンソール出力

Passing generic argument fails
Birth from parameterless constructor, which should not happen

以下のパラメーターなしのコンストラクターをコメントアウトすると、次の例外が発生します。

Castle.MicroKernel.Resolvers.DependencyResolverException was unhandled
Missing dependency.
Component Sand.SandCoordinator`1[[Sand.Simpleton, WindsorSand, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] has a dependency on Sand.IGenericManager`1[Sand.Simpleton], which could not be resolved.
Make sure the dependency is correctly registered in the container as a service, or provided as inline argument.

2 つのコンストラクターを持つデモ クラス

class SandCoordinator<TSimpleton> : ISandCoordinator<TSimpleton>
                                    where TSimpleton : ISimpleton
{
    public SandCoordinator()
    {
        Log = "Birth from parameterless constructor, which should not happen";
    }

    public SandCoordinator(IGenericManager<TSimpleton> manager)
    {
        Log = "Birth from parameterized constructor";
        Log += Environment.NewLine + "Born With Manager: " + manager.Id;
    }        

    public string Log { get; private set; }
}

解決策/回避策?

  • 非ジェネリック型を作成して非interface ISimpleSandCoordinator : ISandCoordinator<Simpleton>ジェネリック インターフェイスを登録すると、パラメーター化された解決が機能することはわかっていますが、ジェネリック型の使用をやめたくありません。
  • これは、Castle Windsor のバグとして報告する必要がありますか?

[ Castle.Core.dll と Castle.Windsor.dll 3.1.0 (2012-08-05) の使用]

4

1 に答える 1

4

あなたはではなくSandCoordinator<T>に依存しています。IGenericManager<T>GenericManager<T>

ArgumentsWindsor に具体的な型以外の何かとして使用させたい値を入れるときは、それについて明示する必要があります。

new Arguments { { typeof(IGenericManager<Simpleton>), runtimeConstructorParam } };
于 2013-01-28T23:03:09.330 に答える