5

我刚刚从 Ninject 更改为 TinyIoC 进行依赖注入,但在构造函数注入时遇到了问题。

我设法将其简化为以下代码段:

public interface IBar { } 

public class Foo
{
    public Foo(IBar bar) { }
}

public class Bar : IBar
{
    public Bar(string value) { }
}

class Program
{
    static void Main(string[] args)
    {
        var container = TinyIoCContainer.Current;

        string value = "test";
        container.Register<IBar, Bar>().UsingConstructor(() => new Bar(value));

        var foo = container.Resolve<Foo>();
        Console.WriteLine(foo.GetType());
    }
}

这会导致 TinyIoCResolutionException 被抛出:

"Unable to resolve type: TinyIoCTestApp.Foo"

并且在该异常内部是一连串内部异常:

"Unable to resolve type: TinyIoCTestApp.Bar"
"Unable to resolve type: System.String"
"Unable to resolve type: System.Char[]"
"Value cannot be null.\r\nParameter name: key"

我使用构造函数注入的方式有问题吗?我意识到我可以打电话

container.Register<IBar, Bar>(new Bar(value));

这确实有效,但是结果是 Bar 的全局实例,这不是我所追求的。

有任何想法吗?

4

1 回答 1

10

我不熟悉 TinyIOC,但我想我可以回答你的问题。

UsingConstructor注册了一个 lambda,它指向ctor(string)TinyIOC 将用来执行自动构造函数注入的构造函数 (the ) 。TinyIOC 将分析构造函数参数,找到一个类型的参数System.String并尝试解析该类型。由于您尚未System.String明确注册(顺便说一句,您不应该这样做),因此解析IBar(因此Foo)失败。

您做出的错误假设是 TinyIOC 将执行您的() => new Bar(value))lambda,但它不会。如果您查看该UsingConstructor方法,您会发现它需要 aExpression<Func<T>>而不是 a Func<T>

您想要的是注册一个进行创建的工厂委托。我希望 TinyIOC 包含一个方法。它可能看起来像这样:

container.Register<IBar>(() => new Bar(value));
于 2012-02-09T08:48:37.473 回答