Передача пользовательской информации в доступ к данным - PullRequest
2 голосов
/ 24 октября 2011

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

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

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

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 && 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 Ответ

2 голосов
/ 24 октября 2011

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

Однако, если вы хотите более немедленное исправление здесь и сейчас, было бы очень рекомендовано использовать встроенный Thread.CurrentPrincipal Ambient Context.

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

...