gpt4 book ai didi

c# - 如何使用 Unity 一次注入(inject)两个实现?

转载 作者:行者123 更新时间:2023-12-03 21:50:44 24 4
gpt4 key购买 nike

我有一个 IConsole 接口(interface),描述如何向控制台写入内容,以及一个实现 upperCaseConsole

IConsole 使用 Unity 注入(inject)到 Foo 类中。

public interface IConsole {
void WriteLine(string text);
}

public class upperCaseConsole: IConsole {
public void WriteLine(string text){
Console.WriteLine(text.ToUpper());
}
}

public class Foo{
private readonly IConsole console;
public Foo(IConsole console){
this.console = console;
}

public void WriteStuff(string stuff){
console.WriteLine(stuff);
}
}

我现在想更改文本写入控制台的方式。我已经很好地将实现与 foo 解耦,并且我可以注入(inject)一个新的实现,例如 lowerCaseConsole

public class lowerCaseConsole: IConsole {
public void WriteLine(string text){
Console.WriteLine(text.ToLower());
}
}

我的问题是,尽管我进行了最好的测试,但我不太确定 lowerCaseConsole 是否能完成这项工作,并且我想同时运行这两个实现一段时间。

如何在不复制 Foo 中的所有代码的情况下做到这一点?

我想避免类似的事情:

public class Foo{
private readonly IConsole lowerConsole;
private readonly IConsole upperConsole;

public Foo([Dependency("lower")] IConsole lowerConsole,
[Dependency("upper")] IConsole upperConsole){
this.lowerConsole = lowerConsole;
this.upperConsole = upperConsole;
}

public void WriteStuff(string stuff){
lowerConsole.WriteLine(stuff);
upperConsole.WriteLine(stuff);
}
}

注意:现实生活中的情况是我即将进行数据库更改。我想透明地开始写入新数据库,看看情况如何,但继续写入当前数据库,以防万一。

最佳答案

一种选择是创建第三个实现,其中包含其他两个类型的私有(private)成员,并且对其 WriteLine 方法的调用将仅转发到其他两种类型。

public class BothCaseConsole : IConsole
{
private readonly LowerCaseConsole lcc = new LowerCaseConsole();
private readonly UpperCaseConsole ucc = new UpperCaseConsole();

public void WriteLine(string text)
{
lcc.WriteLine(text);
ucc.WriteLine(text);
}
}

然后只需将此类型注入(inject)到 Foo 中即可:

new Foo(new BothCaseConsole()).WriteStuff("Stuff to write");

enter image description here

关于c# - 如何使用 Unity 一次注入(inject)两个实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54468284/

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