Передача информации о пользователе для доступа к данным

#dependency-injection #data-access

#внедрение зависимостей #доступ к данным

Вопрос:

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

Теперь нам нужно раскрыть часть логики с помощью webservice, и мы ищем наименее навязчивую форму для передачи пользовательской информации по каналу в классы доступа к базе данных.

Мы придумали передать делегат методам вставки / обновления, который выглядит следующим образом:

 public delegate string GetLogin();

public class BaseEntity : BaseNotifiableEntity, System.ComponentModel.IDataErrorInfo
{
    public GetLogin Login { get; set; }
    (...)
}

public static class BaseEntityHelper
{
    public static SqlCommand buildUpdateCommand(BaseEntity entity)
    {
        UpdateDefaultValues(entity, false);
        (...)
    }

    public static void UpdateDefaultValues(BaseEntity entity, bool affectCreationFields)
    {
        if (entity.Login == null amp;amp; AppServer.RunningApplication.CurrentUser == null)
            throw new Exception("Something went wrong");

        (...)
    }
}
 

Итак, в нашей логике будет что-то вроде этого:

     public class Service
    {
        T_DIST_Service record;
        (...)

        public bool Update(DataAccess.Base.GetLogin login)
        {
            record.Login = login;
            (...)
            record.Update();
        } 
    }
 

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

Возможно, некоторые из вас уже прошли этот путь и могут поделиться некоторыми соображениями. Спасибо за ваше время.

РЕДАКТИРОВАНИЕ 1: использование .NET

Комментарии:

1. Мой плохой, платформа это .NET

Ответ №1:

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

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

Если у вас есть специальная информация, которую ваш пользовательский объект должен переносить, вы можете использовать пользовательскую реализацию IPrincipal для создания пользовательского пользовательского контекста.