Четкая архитектура, как и где я могу реализовать запросы? - PullRequest
0 голосов
/ 25 ноября 2011

Мне нужна помощь с реализацией логики проверки для пользователей. Мне нужно проверить, соответствует ли введенный пользователем пароль passwordhash в пользовательской таблице SQL Server.

Большой вопрос для меня: где я могу реализовать эту логику проверки?

Вы можете увидеть мою пользовательскую реализацию ниже:

public class User : BaseEntity
{
    public virtual string Username { get; set; }
    public virtual string Hash { get; set; }
    public virtual string Salt { get; set; }
}

public interface IUserTasks
{
    List<User> GetAll();
    User Get(int id);
    User CreateOrUpdate(User user);
    void Delete(int id);
    bool Validate(string username, string password);
}

public class UserTasks : IUserTasks
{
    private readonly IRepository<User> _userRepository;
    private readonly IValidateHashQuery _validateHashQuery;

    public UserTasks(IRepository<User> userRepository, IValidateHashQuery validateHashQuery)
    {
        _userRepository = userRepository;
        _validateHashQuery = validateHashQuery;
    } 

    public List<User> GetAll()
    {
        return _userRepository.GetAll().ToList();
    }

    public User Get(int id)
    {
        return _userRepository.Get(id);
    }

    public User CreateOrUpdate(User user)
    {
        return _userRepository.SaveOrUpdate(user);
    }

    public void Delete(int id)
    {
        var entity = _userRepository.Get(id);

        if(entity != null)
        {
            _userRepository.Delete(entity);
        }
    } 

    public bool Validate(string username, string password)
    {
        return _userRepository.PerformQuery(_validateHashQuery) != null ? true : false;
    }
}

Нужно ли реализовывать логику проверки внутри реализации Task или мне нужно создать новый объект запроса внутри моего домена и использовать его в моей реализации Task?

Мне очень нужна помощь в этом, с нетерпением жду ваших ответов!

Rob

Ответы [ 2 ]

0 голосов
/ 10 декабря 2011

AFAIK IRepository.PerformQuery (запрос IQuery) был удален из последней сборки SA в пользу использования Расширенного объекта запроса.

public class ValidateHashQuery : IValidateHashQuery
{
    public bool Validate(string  username, string password)
    {
        ISession nhSession = NHibernateSession.Current;
        // you now have your session and run your query however you like
    }
}

public class UserTasks : IUserTasks
{
    private readonly IRepository<User> _userRepository;
    private readonly IValidateHashQuery _validateHashQuery;

    public UserTasks(IRepository<User> userRepository, IValidateHashQuery         validateHashQuery)
    {
        _userRepository = userRepository;
        _validateHashQuery = validateHashQuery;
    } 

    public List<User> GetAll()
    {
        return _userRepository.GetAll().ToList();
    }

    public User Get(int id)
    {
        return _userRepository.Get(id);
    }

    public User CreateOrUpdate(User user)
    {
        return _userRepository.SaveOrUpdate(user);
    }

    public void Delete(int id)
    {
        var entity = _userRepository.Get(id);

        if(entity != null)
        {
            _userRepository.Delete(entity);
        }
    } 

    public bool Validate(string username, string password)
    {
        return _validateHashQuery.Validate(username, password);
    }
}

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

То же самое относится и к запросу проверки, вы можете добавить эту зависимость к вашему контроллеру и вызвать запрос проверки пользователя непосредственно оттуда, и установить cookie / сессию в соответствии с результатом. Затем перед выполнением задачи, требующей входа пользователя в систему, вы проверяете наличие этого файла cookie (в идеале некоторый атрибут в действии [Autherise]). В зависимости от вашего сценария вы можете захотеть получить это разрешение в самой задаче.

0 голосов
/ 25 ноября 2011

Это давний аргумент, с которым я боролся раньше.

Возьми на себя руководство острой аркой. Они решают эти проблемы с помощью атрибутов и проверяют свой DomainSignatureAttrribute для решения уникальности персистентности объекта.

Для меня это доменная логика. Задачи предназначены для организации одного или нескольких событий в запросе.

Я бы вставил интерфейс репозитория в ваш основной объект и сделал там проверку:

public User(IUserRepsoitory userRepository)
{
 this.userRepsoitory = userRepository;
}

public void IsValid()
{
 return userRepository.IsPsswordValid(this);
}

Я не понимаю, как это нарушает какие-либо правила. Обычно это не рекомендуется .

...