尖锐的体系结构,如何以及在哪里实现查询

本文关键字:在哪里 实现 查询 体系结构 | 更新日期: 2023-09-27 18:15:38

我需要帮助为用户实现验证逻辑。我需要检查用户输入的密码是否与SQL Server用户表中的passwordhash匹配

对我来说最大的问题是,我在哪里实现这个验证逻辑?

你可以看到我的用户实现如下:

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

尖锐的体系结构,如何以及在哪里实现查询

这是一个古老的争论,我以前也和自己争论过。

以Sharp arch为首。他们用属性来解决这些问题,请查看他们的domainsignatureattribute,以解决对象的持久性唯一性。

对我来说,这是领域逻辑。任务用于在请求中编排一个或多个事件。

我将在你的核心对象中注入一个存储库接口,并在那里进行检查:

public User(IUserRepsoitory userRepository)
{
 this.userRepsoitory = userRepository;
}
public void IsValid()
{
 return userRepository.IsPsswordValid(this);
}

我看不出这有什么违反规则的。

我知道了。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/session。然后,在执行需要用户登录的任务之前,检查该cookie(理想情况下是操作[authorise]的某些属性)。根据您的场景,您可能希望在任务本身中拥有该授权。