Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Unity一次性注入两个实现?_C#_Interface_Unity Container - Fatal编程技术网

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");