【发布时间】:2013-07-27 13:27:52
【问题描述】:
我阅读了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 框架,这使得上述解决方案成为问题 - 在这种情况下,我会使用类似的东西:
class Foo
{
private RedisWrapper _redis;
public Foo(IRedisWrapperFactory redisFactory)
{
_redis = redisFactory.Create();
}
}
我真的很想听听您对上述解决方案的意见。
谢谢
【问题讨论】:
标签: c# unit-testing design-patterns dependency-injection simple-injector