作者lovesnake (LoyalDog)
看板Programming
标题[问题] 如何解决IoC的缺点?
时间Mon Mar 7 16:27:27 2016
使用语言 : C++11
翻了一个星期关於IoC的东西,还是搞不太懂。
我的理解如下 :
IoC : 让物件相依於介面而不相依於物件
>>>>>>缺点 : 外部的人不知道该注入哪个Imp
DI Framework : 解决上述缺点
问题来了...
看了几个DI Framework
Boost的Injector要User自己写
Unity的Configuration也是User自己写...
这样使用者还是不知道要注入哪个Imp...
於是头很痛,怎麽样让用了IoC後的API用起来跟没有一样呢?
让使用者完全不用烦恼到底要注入哪个Imp呢?
目前比较能接受的事Factory,可还是觉得很奇怪,有点不太直觉
(Factory.GetImp("normal"); Factory.GetImp("testing");) ??
请指教 <(_ _)>
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.133.8.232
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Programming/M.1457339250.A.3B0.html
1F:→ n3oanderson: Factory.GetImp("proj.web.class") 61.230.64.181 03/07 19:15
2F:→ n3oanderson: runtime change conf for diff env 61.230.64.181 03/07 19:16
3F:→ n3oanderson: proj.web.class=test.A 61.230.64.181 03/07 19:16
4F:→ n3oanderson: proj.web.class=prod.A 61.230.64.181 03/07 19:16
这样还是要使用者自己选择Orz
话说为什麽没看过用DI要使用者自己注入的Lib呢?
用了很多Lib还没看过要使用者自己注入的情况,还是压根没有这种东西 Orz?
※ 编辑: lovesnake (220.133.8.225), 03/08/2016 19:05:08
5F:→ adrianshum: 1. Ioc 本身定义就不明。DI 是某部份 14.0.169.171 03/13 07:54
6F:→ adrianshum: (最重贾的)ioc的目的。 2. "使用者" 14.0.169.171 03/13 07:54
7F:→ adrianshum: 指谁?DI 并不是让真的使用者去碰的 14.0.169.171 03/13 07:54
8F:→ adrianshum: 呀 14.0.169.171 03/13 07:54
9F:→ adrianshum: 也看不懂你不明白的地方是什麽,DI 14.0.169.171 03/13 07:57
10F:→ adrianshum: 最重要是解除component 的相依性, 14.0.169.171 03/13 07:57
11F:→ adrianshum: 但怎麽连起components 造出整个系统 14.0.169.171 03/13 07:57
12F:→ adrianshum: 还是developer 的功作 14.0.169.171 03/13 07:57
13F:→ adrianshum: (打错好多字)「重要」、「工作」 14.0.169.171 03/13 07:58
举一个简单的例子,
在Console的环境下,有一个API要写的功能是输出UI。
class UIPrinter
{
public:
void PrintUI();
}
因为在Console下,直接使用Standard Output是可以预见的。
但今天为了Testability,要利用IoC将Standard Output抽换为Output Stream。
这样在测试时,Inject String Stream,才可以顺利测试。
class UIPrinter
{
public:
UIPrinter(ostream* outputStream);
public:
voic PrintUI();
private:
ostream* m_outputStream;
}
这个API即是使用者直接使用的。(这里的User是使用此API的Programmer)
如果这时候利用DI Framework,就会造成使用者要自己将组态设定好的问题。
output stream有这麽多种,使用者怎麽会知道要用哪个才可以让API正常运作呢?
※ 编辑: lovesnake (220.133.8.225), 03/16/2016 10:20:07