4

私は何かが足りないか、何らかの形で愚かなことをしていると思いますが、それを理解することはできません。次の2つのクラスを想定します。

public class A
{
    public A(string a, string b)
    {
    }
}

public class B
{
    public B(A boris2)
    {
    }
}

そしてこのmain方法:

private static void Main(string[] args)
{
    var container = new WindsorContainer();
    container.Register(
        Component.For<A>().LifeStyle.Transient.ImplementedBy<A>().Named("Boris2")
        //.DynamicParameters((k,d)=>{
        //  d["b"] = "jkl";
        //})
        .DependsOn(new { a = "ghi", b="jkl" })
        );

    container.Register(
        Component.For<B>().LifeStyle.Transient.ImplementedBy<B>()
        .DependsOn(Dependency.OnComponent("boris2", "Boris2"))
        );

    var b = container.Resolve<B>();
    Console.WriteLine("Okay");
    Console.ReadKey();
}

上記のようにこのメソッドを実行すると、出力されOkay、returnキーを押すと、終了します。すべてが順調。ただし、コメントアウトされたコードに示されているように、bパラメーターを動的に計算する必要があります(最終的には計算されますが、問題の核心に到達したかっただけです)

したがって、Register代わりに次のように最初の呼び出しを行うと、次のようになります。

    container.Register(
        Component.For<A>().LifeStyle.Transient.ImplementedBy<A>().Named("Boris2")
        .DynamicParameters((k, d) =>
        {
            d["b"] = "jkl";
        })
        .DependsOn(new { a = "ghi" })
        );

これはほぼ同等だと思いましたが、例外が発生します。

Castle.MicroKernel.Handlers.HandlerException was unhandled
  HelpLink=groups.google.com/group/castle-project-users
  HResult=-2146233088
  Message=Can't create component 'PlayAreaCS_Con.B' as it has dependencies to be satisfied.

'PlayAreaCS_Con.B' is waiting for the following dependencies:
- Component 'Boris2' (via override) which was registered but is also waiting for dependencies.

'Boris2' is waiting for the following dependencies:
- Parameter 'b' which was not provided. Did you forget to set the dependency?

  Source=Castle.Windsor
  StackTrace:
       at Castle.MicroKernel.Handlers.DefaultHandler.AssertNotWaitingForDependency()
       at Castle.MicroKernel.Handlers.DefaultHandler.ResolveCore(CreationContext context, Boolean requiresDecommission, Boolean instanceRequired, Burden& burden)
       at Castle.MicroKernel.Handlers.DefaultHandler.Resolve(CreationContext context, Boolean instanceRequired)
       at Castle.MicroKernel.Handlers.AbstractHandler.Resolve(CreationContext context)
       at Castle.MicroKernel.DefaultKernel.ResolveComponent(IHandler handler, Type service, IDictionary additionalArguments, IReleasePolicy policy)
       at Castle.MicroKernel.DefaultKernel.Castle.MicroKernel.IKernelInternal.Resolve(Type service, IDictionary arguments, IReleasePolicy policy)
       at Castle.MicroKernel.DefaultKernel.Resolve(Type service, IDictionary arguments)
       at Castle.Windsor.WindsorContainer.Resolve[T]()
       at PlayAreaCS_Con.Program.Main(String[] args) in c:\Dev\PlayAreaCS_Con\PlayAreaCS_Con\Program.cs:line 49
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

両方のパラメーターを移動しDynamicParametersて削除しようDependsOnとしましたが、2つを混合することで問題が発生する可能性があると考えましたが、それでもエラーが発生します。私が解決できることから、それは私のラムダをまったく呼び出していません。

私は何が間違っているのですか?

編集

コメントアウトした場合:

.DependsOn(Dependency.OnComponent("boris2", "Boris2"))

私の2回目のRegister呼び出しから、それは機能します。ただし、名前だけで区別される、いくつかの同一のコンポーネントをコンテナーに登録する必要があります。Register(関連性がないように思われるため、最初の呼び出しから他の登録を削除しました)

4

2 に答える 2

0

同様のシナリオを試しました。動的パラメーターを使用していましたが、すべて問題ありませんでした。

名前付き登録を追加し、DependsOn(ServiceOverride.ForKey) を使用していくつかを参照したところ、「次の依存関係を待っています」というエラーが大量に発生しました。

次に、すべての動的依存関係を匿名オブジェクト形式に変換しましたが、すべて問題ありませんでした。これらのステップの間に他に何もしませんでした。Windsor バージョン 3.3.0 を使用しています。でも、最終的にうまくいったことをうれしく思います。

于 2016-01-26T23:45:30.950 に答える