【问题标题】:Castle Windsor 3 with constructor argument as stringCastle Windsor 3,构造函数参数为字符串
【发布时间】:2011-11-28 11:29:35
【问题描述】:

我之前没用过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>

这个类看起来像:

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 框架和该领域的文档了解不够

【问题讨论】:

  • 温莎城堡的哪个版本?

标签: .net dependency-injection castle-windsor


【解决方案1】:

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

这是文档中的通用示例:

var twitterApiKey = @"the key goes here";

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

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

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

看起来这可能从 3.1 版开始,但我无法完全破译他们的更新标记约定。

【讨论】:

    【解决方案2】:

    尝试调用 DependsOn 的重载,它采用键/值对的 IDictionary 来指定依赖关系:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-05
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多