gpt4 book ai didi

c# - 当我转向依赖注入(inject)时 using 语句会发生什么

转载 作者:IT王子 更新时间:2023-10-29 04:39:24 25 4
gpt4 key购买 nike

我目前正在使用以下代码:

public class MyProvider
{
public MyProvider()
{
}

public void Fetch()
{
using (PopClient popClient = new PopClient())
{
....
}
}
}

因为我希望能够对 Fetch 方法进行单元测试,并且由于我无法模拟 PopClient,所以我创建了一个接口(interface)和一个调用 PopClient 的包装类。我更新后的代码如下所示:

public class MyProvider
{
private readonly IPopClient popClient;

public MyProvider(IPopClient popClient)
{
this.popClient = popClient;
}

public void Fetch()
{
using (var pop3 = popClient)
{
....
}
}
}

我正在使用 Ninject 进行依赖项注入(inject),我不太确定 using 语句将在更新的代码中产生什么样的效果,因为 Ninject 已经创建了一个 PopClient 实例并将其注入(inject)到构造函数中。

using 语句是否会处理 pop3 对象并单独保留 popClient 对象以便 Ninject 可以处理它,或者 using 语句是否会干扰 Ninject?

在这种情况下,正确的做法是什么?任何见解都会非常有帮助。

最佳答案

pop3 变量将被赋予对 popClient 具有的 IPopClient 对象的相同引用,因此当 using 语句结束,局部变量和实例变量引用的对象将被 Dispose()d,可能将其置于不一致状态以供进一步使用。

如果你想使用多个 IPopClient 实例,每个 Fetch() 调用一个,你应该做的是注入(inject)一个“工厂方法”:

public class MyProvider
{
private readonly Func<IPopClient> createPopClient;

public MyProvider(Func<IPopClient> popClientFactory)
{
this.createPopClient = popClientFactory;
}

public void Fetch()
{
using (var pop3 = createPopClient())
{
....
}
}
}

现在,当您调用 Fetch() 时,它将执行工厂方法,该方法将返回对 IPopClient 的新引用,可以使用然后处理不影响对该方法的任何其他调用。

AutoFac 支持为已注册的类型注入(inject)工厂方法,无需任何额外设置(我认为它的名字由此而来);我相信在配置 Ninject 容器时,您需要显式注册一个“getter”作为给定返回类型的工厂方法(可以像 lambda ()=>new PopClient() 一样简单或者它可以调用容器的解析方法)。

关于c# - 当我转向依赖注入(inject)时 using 语句会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12360271/

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