gpt4 book ai didi

c# - 使用 TinyIoC 进行构造函数注入(inject)

转载 作者:太空狗 更新时间:2023-10-30 00:43:56 27 4
gpt4 key购买 nike

我刚刚从 Ninject 更改为 TinyIoC 以进行依赖项注入(inject),但我在构造函数注入(inject)方面遇到了麻烦。

我已经设法将它简化为这个片段:

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"

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

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

这确实有效,但结果是 Bar 的全局实例,这不是我想要的。

有什么想法吗?

最佳答案

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

UsingConstructor注册一个指向构造函数(ctor(string))的 lambda,TinyIOC 将使用它来自动注入(inject)构造函数。 TinyIOC 将分析构造函数参数,找到类型为 System.String 的参数并尝试解析该类型。因为你还没有注册System.String明确地(你不应该顺便说一句),解决 IBar (因此 Foo )失败了。

您做出的错误假设是 TinyIOC 将执行您的 () => new Bar(value)) lambda,它不会。如果您查看 UsingConstructor方法你可能会看到它需要一个 Expression<Func<T>>而不是 Func<T> .

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

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

关于c# - 使用 TinyIoC 进行构造函数注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9202899/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com