首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将DynamicParameters和DependsOn混合

如何将DynamicParameters和DependsOn混合
EN

Stack Overflow用户
提问于 2013-03-07 14:43:57
回答 2查看 1.4K关注 0票数 4

我想我错过了什么,或者我在做一些愚蠢的事情,但我无法理解。假设有以下两个类:

代码语言:javascript
复制
public class A
{
    public A(string a, string b)
    {
    }
}

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

这个main方法是:

代码语言:javascript
复制
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,然后按“返回”,然后退出。一切都很好。但是,正如注释掉的代码中所示,我希望动态计算b参数(最终它将被计算出来,但我只想了解问题的核心)。

因此,如果我第一次打电话给Register,如下所示:

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

我认为这大致相当于,我现在得到了一个例外:

代码语言:javascript
复制
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,认为将这两个参数混合在一起可能有些问题,但仍然存在错误。据我所知,这根本不是在调用我的lambda。

我做错了什么?

编辑

如果我评论一下:

代码语言:javascript
复制
.DependsOn(Dependency.OnComponent("boris2", "Boris2"))

从我的第二个Register电话开始,它就能工作了。但我确实需要在容器中注册几个相同的组件,只需按名称进行区分。(我已经从第一个Register调用中删除了另一个注册,因为它似乎与此无关)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-07 23:41:42

我不知道该说什么,除了:在我的机器上工作(用温莎3.2),用原始的(第一)代码,在这里我只是取消注释掉的代码。

票数 1
EN

Stack Overflow用户

发布于 2016-01-26 23:45:30

我只是尝试了一个类似的场景。我用的是动态参数,一切都很好。

我添加了命名注册并引用了一些使用DependsOn(ServiceOverride.ForKey)的错误,并得到了一大堆“正在等待下面的依赖项”错误。

然后,我将所有的动态依赖项转换为匿名对象表单,一切都很好。在这两步之间我什么也没做。我使用的是温莎3.3.0版本。我很高兴它终于起作用了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15274103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档