尖锐的架构,我如何以及在何处实现查询?

时间:2011-11-25 12:17:20

标签: c# dependency-injection s#arp-architecture

我需要帮助为用户实现验证逻辑。我需要检查用户输入的密码是否与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实现中使用它?

我真的需要帮助,期待你的回复!

罗布

2 个答案:

答案 0 :(得分:0)

这是一个古老的争论,我之前曾与自己斗争过。

采取夏普拱门的领先优势。他们用属性检查这些问题,检查他们的DomainSignatureAttrribute,以解决对象的持久性统一性。

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

我将存储库接口注入您的核心对象并在那里进行检查:

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

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

我没看到这违反了任何规则。 This generally isnt recommended

答案 1 :(得分:0)

AFAIK IRepository.PerformQuery(IQuery查询)已从最新版本的SA中删除,支持使用Enhanced query object.

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(理想情况下,操作[Autherise]上的某些属性)。根据您的情况,您可能希望在任务本身中拥有该授权。