我阅读了 Miško Hevery 的指南:编写可测试代码,如果“构造函数完成后对象未完全初始化(注意初始化方法)”,它会发出警告信号。
假设我编写了一个 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();
}
}
我真的很想听听您对上述解决方案的意见。
谢谢