我讀Miško Hevery's Guide: Writing Testable Code,如果「在構造函數完成後未完全初始化對象(注意初始化方法)」,它會聲明一個警告標誌。依賴注入和初始化方法
比方說,我寫了一個Redis包裝類,它有一個接受主機名和端口的init方法。根據Miško的說法,這是一個警告信號,因爲我需要調用它的init方法。
我正在考慮的解決方案如下: 對於需要這種初始化的每個類,創建一個具有創建類的Create方法的工廠類,並調用其init方法。
現在代碼:
class Foo
{
private IRedisWrapper _redis;
public Foo(IRedisWrapper redis)
{
_redis = redis;
}
}
....
IRedisWrapper redis = new RedisWrapper();
redis.init("localhost", 1234);
Foo foo = new Foo(redis);
我會使用類似::
class Foo
{
private IRedisWrapper _redis;
public Foo(IRedisWrapper redis)
{
_redis = redis;
}
}
....
RedisWrapperFactory redisFactory = new RedisWrapperFactory();
IRedisWrapper redisWrapper = redisFactory.Create();
Foo foo = new Foo(redisWrapper);
我使用Simple Injector
作爲IOC框架,這使得這個上面,而不是使用喜歡的事的解決probelmatic - 在這種情況下,我會使用類似的東西:
class Foo
{
private RedisWrapper _redis;
public Foo(IRedisWrapperFactory redisFactory)
{
_redis = redisFactory.Create();
}
}
我真的很喜歡聽取您對上述解決方案的意見。
感謝
太棒了,這正是我正在尋找的答案 - 謝謝! – kernix
我想澄清的最後一件事 - 當Misko聲明「在構造函數完成後未完全初始化對象(注意初始化方法)」 - 他的意思是什麼? – kernix
這是關於[時間耦合](http://blog.ploeh.dk/2011/05/24/DesignSmellTemporalCoupling/)。這是一種設計氣味。 – Steven