为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
哔哔one 2022-08-20 14:48:00
我有一个界面,描述如何将东西写到控制台,还有一个实现,.IConsoleupperCaseConsoleIConsole 使用 Unity 注入到类中。Foopublic 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分离,我可以注入一个新的实现,比如说。lowerCaseConsolepublic 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);        }    }注意:现实生活中的情况是我即将继续进行数据库更改。我想透明地开始写入新数据库,看看事情进展如何,但请继续写入当前数据库,以防万一。
查看完整描述

2 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

一种选择是创建包含其他两个的私有成员的第三个实现,并且对其方法的调用将仅转发给其他两种类型。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");

//img1.sycdn.imooc.com//630083cf000107a803550170.jpg

查看完整回答
反对 回复 2022-08-20
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

您可以使用命名注册来注入 。这种方法很容易通过更多的实现进行扩展...或者您可以轻松删除其中一个...IEnumerable<IConsole>


container.RegisterType<IConsole, LowerConsole>("LowerConsole");

container.RegisterType<IConsole, UpperConsole>("UpperConsole");

container.RegisterType<IEnumerable<IConsole>, IConsole[]>();

然后ctor变得有点不同,还有方法...FooWriteStuff


public Foo(IEnumerable<IConsole> consoles)

{

    this.consoles = consoles; 

}


public void WriteStuff(string stuff)

{

    foreach(var console in consoles)

    {

        console.WriteLine(stuff);

    }

}


查看完整回答
反对 回复 2022-08-20
  • 2 回答
  • 0 关注
  • 92 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信