SRP和班级内部的其他逻辑

时间:2019-03-20 22:27:00

标签: c# oop design-patterns architecture single-responsibility-principle

例如,我有一个类,它对某些外部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(使用私有方法则不必这样做,因为devKeyServiceCore内的私有属性),必须为LoginCore编写构造函数并传递相同的依赖项注入参数,我将它们传递给ServiceCore。我必须先创建LoginCore实例,然后再调用LoginAsync

我不会在其他地方使用此LoginCore,仅在ServiceCore中,我不需要进行依赖注入(因为我不需要替换LoginCore的方法LoginAsync对于任何电话都是实际的。 我只有一个好处:我可以将LoginCore标记为:

[assembly: InternalsVisibleTo("BillComRealTest")] 

并仅针对LoginAsync方法编写单元测试,并使用模拟HttpMessageHandler

我应该使用一个用于遵循SRP的方法创建单独的类还是在ServiceCore内创建仅私有方法?

0 个答案:

没有答案