Castle Windsor 3以构造函数参数作为字符串

问题描述:

我以前从未使用过Windsor,但使用过其他DI框架,此刻我遇到了一个相当奇怪的问题。Castle Windsor 3以构造函数参数作为字符串

我有一个工厂类,它需要一个字符串在其构造,但是每当我试图解决该对象我得到一个异常说:

Handler for System.String was not found. 

<Message>Handler for System.String was not found.</Message> 
<StackTrace>at Castle.MicroKernel.Resolvers.DefaultDependencyResolver.TryGetHandlerFromKernel(DependencyModel dependency, CreationContext context) in d:\60b7fa65294e7792\src\Castle.Windsor\MicroKernel\Resolvers\DefaultDependencyResolver.cs:line 403 
at Castle.MicroKernel.Resolvers.DefaultDependencyResolver.ResolveCore(CreationContext context, ComponentModel model, DependencyModel dependency) in d:\60b7fa65294e7792\src\Castle.Windsor\MicroKernel\Resolvers\DefaultDependencyResolver.cs:line 270</StackTrace> 
<Type>Castle.MicroKernel.Handlers.HandlerException</Type> 
</InnerException> 
<Message>Missing dependency. 
Component SomeExampleFactory has a dependency on System.String, which could not be resolved. 
Make sure the dependency is correctly registered in the container as a service, or provided as inline argument.</Message> 

类看起来类似:

public interface IDummyFactory 
{ 
    void DoSomething(); 
} 

public class DummyFactory : IDummyFactory 
{ 
    private string someString; 

    public DummyFactory(string someConstructorArg) 
    { 
     someString = someConstructorArg; 
    } 
} 

使用DI设置如下:

var someString = "some constructor arg"; 
_container.Register(Component.For<IDummyFactory>().ImplementedBy<DummyFactory>().DependsOn(someString)); 

我假设它试图做一些类型的铸造或格式化导致它被炸出来,但由于类型本身是一个字符串,并且该变量被传递给一个字符串......它甚至可能是一种情况,它试图映射该变量的类型而不是变量的内容,但我不知道有足够的了解这附近的DI框架和文档

+0

哪个版本的温莎城堡? –

尝试调用的DependsOn超载这需要键/值对的IDictionary指定依赖:

_container.Register(
    Component.For<IDummyFactory>() 
     .ImplementedBy<DummyFactory>() 
     .DependsOn(new Hashtable 
     { 
      { "someConstructorArg", "some constructor arg" } 
     })); 

我也在寻找这个答案,看起来他们现在有一些简单的东西,他们称之为“内联依赖”,这是通过(其他方式)D依赖.OnValue()方法。

下面是从文档的一般示例:

var twitterApiKey = @"the key goes here"; 

container.Register(
    Component.For<ITwitterCaller>().ImplementedBy<MyTwitterCaller>() 
     .DependsOn(Dependency.OnValue("APIKey", twitterApiKey)) 
    ); 

它将使用值twitterApiKey为的名称为“APIKey”(不区分大小写)的参数中。

http://docs.castleproject.org/Windsor.Inline-Dependencies.ashx

它看起来像这样可能已经在3.1版本以上的,但我不能完全破译它们的更新标记约定。