Четкая архитектура, как и где я могу реализовать запросы?

Мне нужна помощь в реализации логики проверки для пользователей. Мне нужно проверить, соответствует ли введенный пользователем пароль 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 реализация?

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

обкрадывать

2 ответа

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

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

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

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

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

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

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

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]). В зависимости от вашего сценария вы можете захотеть получить это разрешение в самой задаче.

Другие вопросы по тегам