0

想象下面的构造函数

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 在他的书中描述了当有良好的本地默认值时属性注入是合适的,但我在这个示例中努力决定首先使用本地默认值是否合适。

4

1 回答 1

0

我永远不会有这样的本地默认值,因为单元测试很痛苦。

如果您想使用默认类来简化类的实例化,那么我会使用这样的构造函数覆盖:

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;}
于 2018-04-04T21:52:25.390 回答