Чистые способы чтения нескольких вызовов httpContext в классе веб-форм - PullRequest
1 голос
/ 26 октября 2019

Я хотел бы знать, есть ли у других варианты написать следующее как «Чистый код»

Также ... это написано в VB, но я рад за предложения в C #

(Я только что написал это в блокноте ... возможно, не компилируется, но это принцип, который я задаю вопрос)

public class MyTest

    public sub new()
    end sub

    public sub SaveSomething(message as string)
        save($"{GetSessionId} == {GetIdentityName} == {message}")   
        if configurationmanager.appsettings("allowSomething") then
            doSomethingElse()
        end if
    end function

    private function GetSessionId as string
        if httpcontext.current?.session?.sessionID isNot Nothing then
            return httpcontext.current.session.sessionID
        else
            return ""
        end if
    end function

    private function GetIdentityName as string
        if httpcontext.current?.user?.identity?.name isNot Nothing then
            return httpcontext.current.user.identity.name
        else
            return ""
        end if
    end function

    private sub save(message)
        dim filePath as string = configurationmanager.appsettings("filePath")
        'some code here to save
    end sub

    private sub doSomethingElse()
        'some code here
    end sub
end class

Теперь я хочу удалить все ссылки "httpContext" и "ConfigurationManager"(чище, и поэтому я могу провести модульное тестирование и т. д.)

Один из методов, который я рассмотрел, - это создание классов провайдеров для этих четырех ситуаций, например

_SessionIdProvider as ISessionIdProvider
_IdentityNameProvider as INameProvider
_FilePathProvider as IPathProvider
_AppSettingsAllowSomethingProvider as IAllowSomethingProvider

и внедрение всех этих данных! который я теперь считаю беспорядочным

Я рассмотрел вспомогательный класс, поэтому один объект для внедрения, который я могу использовать для получения этих значений ... но в других местах решения может потребоваться, например, sessionID, с другимизначения, которых нет в этом вспомогательном классе, поэтому может иметь либо дублирующий код, либо массивный вспомогательный класс

Есть мысли? грязно ли вводить слишком много таких зависимостей?

1 Ответ

0 голосов
/ 06 ноября 2019

Я не думаю, что четыре - это слишком много зависимостей, но это может быть на грани ... Я предлагаю вам следовать Принципу обращения зависимостей и позволить клиентскому классу (MyTest)«проектировать» необходимые интерфейсы.

Поскольку ни один из рассматриваемых методов не принимает аргументов, вы можете уменьшить все зависимости до примитивных зависимостей .

в C #это может выглядеть так:

public class MyTest
{
    public MyTest(string sessionId, string identityName, bool allowSomething, string filePath)
    {
        SessionId = sessionId;
        IdentityName = identityName;
        AllowSomething = allowSomething;
        FilePath = filePath;
    }

    public string SessionId { get; }
    public string IdentityName { get; }
    public bool AllowSomething { get; }
    public string FilePath { get; }

    public void SaveSomething(string message)
    {
        Save($"{SessionId} == {IdentityName} == {message}");
        if (allowSomething))
            DoSomethingElse();
    }

    private void Save(message)
    {
        var filePath = FilePath;
        // some code here to save
    }

    private void DoSomethingElse()
    {
        // some code here
    }
}

Три значения SessionId, IdentityName и AllowSomething выглядят так, как будто они принадлежат группе значений, относящихся к аутентификации и авторизации, поэтому, возможно, онилучше подходит как объект параметров .

...