我刚从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的一个全局实例,这不是我想要的。
有什么想法吗?

最佳答案

我对Tinyioc不熟悉,但我想我能回答你的问题。
UsingConstructor注册一个lambda,该lambda指向tinyioc将用于进行自动构造函数注入的构造函数(thector(string))。tinyioc将分析构造函数参数,找到System.String类型的参数并尝试解析该类型。由于您没有显式注册System.String(这是您不应该知道的),解析IBar(因此Foo)失败。
您所做的错误假设是tinyioc将执行您的() => new Bar(value))lambda,但它不会执行。如果你看看UsingConstructor方法,你会发现它需要一个Expression<Func<T>>而不是一个Func<T>
你想要的是注册一个工厂委托来进行创建。我希望tinyioc包含一个方法。可能是这样的:

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

08-27 11:53