想象以下强制性
public RestClient(
string key,
Uri baseAddress,
IHttpClient httpClient,
ISerializer serializer,
IResponseFactory responseFactory)
{
_key = key;
_baseAddress = baseAddress;
_httpClient = httpClient;
_serializer = serializer;
_responseFactory = responseFactory;
}
何时创建这样的本地默认值?
public RestClient(
string key,
Uri baseAddress,
IHttpClient httpClient,
ISerializer serializer,
IResponseFactory responseFactory)
{
_key = key;
_baseAddress = baseAddress;
_serializer = serializer;
_responseFactory = responseFactory;
HttpClient = new HttpClientAdapter();
}
IHttpClient HttpClient {get; set;}
允许使用属性注入覆盖IHTTPCLIENT的依赖性。
还是消费者通过构造函数中的依赖性而不是完全依赖本地默认值的责任?Mark Seemann在他的书中描述说,当有良好的本地默认值时,财产注射是适当的,但我在此示例中挣扎以决定是否首先使用本地违约。
我永远不会有这样的本地默认值,因为这是单位测试的痛苦。
如果您想简化类的实例化,则使用默认类,那么我会选择这样的构造函数覆盖:
public RestClient(
string key,
Uri baseAddress,
ISerializer serializer,
IResponseFactory responseFactory)
: this(key, baseAddress, new HttpClientAdapter(), serializer, responseFactory)
{
}
public RestClient(
string key,
Uri baseAddress,
IHttpClient httpClient,
ISerializer serializer,
IResponseFactory responseFactory)
{
_key = key;
_baseAddress = baseAddress;
_serializer = serializer;
_responseFactory = responseFactory;
HttpClient = httpClient;
}
IHttpClient HttpClient {get; private set;}