#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 для создания пользовательского пользовательского контекста.