城堡温莎3与构造函数参数作为字符串

Gro*_*fit 6 .net dependency-injection castle-windsor

我以前从未使用过Windsor但是已经使用过其他DI框架,而且我现在有一个相当奇怪的问题.

我有一个工厂类,它的构造函数中包含一个字符串,但每当我尝试解析该对象时,我得到一个异常说:

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>
Run Code Online (Sandbox Code Playgroud)

该类看起来像:

public interface IDummyFactory
{
    void DoSomething();
}

public class DummyFactory : IDummyFactory
{
    private string someString;

    public DummyFactory(string someConstructorArg)
    {
        someString = someConstructorArg;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用以下DI设置:

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

我假设它正在尝试进行某种类型的转换或格式化导致它爆炸,但由于类型本身是一个字符串,而变量是以字符串形式传递的...它甚至可能是一个案例,它试图映射该变量的类型而不是变量内容,但我对DI框架和该领域的文档知之甚少

Mat*_*ein 10

我也在寻找这个问题的答案,看起来他们现在有一些更简单的东西,他们称之为"内联依赖",这是由(以及其他方式)Dependency.OnValue()方法实现的.

以下是文档中的通用示例:

var twitterApiKey = @"the key goes here";

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

它将使用twitterApiKey中的值作为名称为"APIKey"(不区分大小写)的参数.

https://github.com/castleproject/Windsor/blob/master/docs/inline-dependencies.md

看起来这可能已经从版本3.1开始,但我不能完全破译他们的更新标记约定.


Ian*_*son 8

尝试调用其重载DependsOn采用IDictionaryKey/Value对来指定依赖项:

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