例如,我有一个类,它对某些外部API进行不同的请求:
internal class ServiceCore : IDisposable
{
public ServiceCore(IConfiguration configuration, Func<HttpMessageHandler> handler)
{
_configuration = configuration;
_handler = handler;
devKey = _configuration.GetSection("ApiBillCom:DevKey").Value;
client = new HttpClient(_handler())
{
BaseAddress = new Uri(_configuration.GetSection("ApiBillCom:ApiUrl").Value)
};
if (_sessionId == null || !_sessionId.IsValueCreated)
SetSessionId();
}
public async Task<JToken> ListJTokenAsync(int start, int count, string endpoint, bool nested = false, List<FilterData> filterData = null)
{
//....
}
public async Task<List<T>> ListAsync<T>(string endpoint, int start, int count, bool nested = false, List<FilterData> filterData = null)
{
//.....
}
好的,但是每个调用都需要sessionId,我们可以在之前调用LoginAsync
方法。此LoginAsync
方法可以作为此类ServiceCore
类中的私有方法:
private void SetSessionId()
{
_sessionId = null;
LoginCore loginCore = new LoginCore(_configuration, _handler);
_sessionId = new Lazy<string>(() => LoginAsync().Result);
}
private async Task<string> LoginAsync()
{
但是随后,似乎违反了“单一责任原则”(因为ServiceCode
有2个职责,将数据获取(或放入)到API并支持会话。我进行了重构并将其移至特殊类:
internal class LoginCore
{
private readonly IConfiguration _configuration;
private readonly Func<HttpMessageHandler> _handler;
public LoginCore(IConfiguration configuration, Func<HttpMessageHandler> handler)
{
_configuration = configuration;
_handler = handler;
}
internal async Task<string> LoginAsync(string devKey)
{
// ....
}
}
目前没有违反SRP的情况,每个类都只有一个职责(ServiceCore
-使用API,LoginCore
-获取实际的sessionId),但是我不确定是否需要这样做(将登录工作流程分隔到另一个类)。现在,我必须将一个参数传递给LoginAsync(使用私有方法则不必这样做,因为devKey
是ServiceCore
内的私有属性),必须为LoginCore
编写构造函数并传递相同的依赖项注入参数,我将它们传递给ServiceCore
。我必须先创建LoginCore
实例,然后再调用LoginAsync
我不会在其他地方使用此LoginCore
,仅在ServiceCore
中,我不需要进行依赖注入(因为我不需要替换LoginCore
的方法LoginAsync
对于任何电话都是实际的。
我只有一个好处:我可以将LoginCore
标记为:
[assembly: InternalsVisibleTo("BillComRealTest")]
并仅针对LoginAsync
方法编写单元测试,并使用模拟HttpMessageHandler
。
我应该使用一个用于遵循SRP的方法创建单独的类还是在ServiceCore
内创建仅私有方法?