C# 如何使用Unity一次性注入两个实现?
我有一个C# 如何使用Unity一次性注入两个实现?,c#,interface,unity-container,C#,Interface,Unity Container,我有一个IConsole接口,描述如何将内容写入控制台,还有一个实现,upperCaseConsole IConsole使用Unity注入Foo类 public interface IConsole { void WriteLine(string text); } public class upperCaseConsole: IConsole { public void WriteLine(string text){ Console.WriteLine(text.ToU
IConsole
接口,描述如何将内容写入控制台,还有一个实现,upperCaseConsole
IConsole使用Unity注入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解耦,并且我可以只注入一个新的实现,比如说lowercaseconosole
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);
}
}
注意:现实生活中的情况是,我将继续进行DB更改。我希望以透明的方式开始向新数据库写入数据,看看情况如何,但要继续向当前数据库写入数据,以防万一。您可以使用命名注册来注入
IEnumerable
。这种方法很容易通过更多的实现进行扩展…或者您可以很容易地删除其中一个
container.RegisterType<IConsole, LowerConsole>("LowerConsole");
container.RegisterType<IConsole, UpperConsole>("UpperConsole");
container.RegisterType<IEnumerable<IConsole>, IConsole[]>();
一个选项是创建第三个实现,其中包含其他两个实现的私有成员,对它的
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);
}
}
然后只需将此类型注入Foo
:
new Foo(new BothCaseConsole()).WriteStuff("Stuff to write");
创建另一个实现了
IConsole
的类,并将上层和下层实现都注入到该类中,然后将调用转发给它们。然后将其注入到Foo中。或者,您可以放弃注入,而是使用事件执行此操作。然后,您可以订阅任意数量的实现。
new Foo(new BothCaseConsole()).WriteStuff("Stuff to write");