如何使用 Unity 一次性注入两个实现?

我有一个界面,描述如何将东西写到控制台,还有一个实现,.IConsoleupperCaseConsole


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分离,我可以注入一个新的实现,比如说。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);

        }

    }

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


哔哔one
浏览 93回答 2
2回答

MMTTMM

一种选择是创建包含其他两个的私有成员的第三个实现,并且对其方法的调用将仅转发给其他两种类型。WriteLinepublic 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);    }}然后只需将此类型注入到:Foonew Foo(new BothCaseConsole()).WriteStuff("Stuff to write");

犯罪嫌疑人X

您可以使用命名注册来注入 。这种方法很容易通过更多的实现进行扩展...或者您可以轻松删除其中一个...IEnumerable<IConsole>container.RegisterType<IConsole, LowerConsole>("LowerConsole");container.RegisterType<IConsole, UpperConsole>("UpperConsole");container.RegisterType<IEnumerable<IConsole>, IConsole[]>();然后ctor变得有点不同,还有方法...FooWriteStuffpublic Foo(IEnumerable<IConsole> consoles){&nbsp; &nbsp; this.consoles = consoles;&nbsp;}public void WriteStuff(string stuff){&nbsp; &nbsp; foreach(var console in consoles)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; console.WriteLine(stuff);&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP