C# Sharp架构,如何以及在何处实现查询?

C# Sharp架构,如何以及在何处实现查询?,c#,dependency-injection,s#arp-architecture,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 stri

我需要帮助为用户实现验证逻辑。我需要检查用户输入的密码是否与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;
    }
}
公共类用户:BaseEntity
{
公共虚拟字符串用户名{get;set;}
公共虚拟字符串哈希{get;set;}
公共虚拟字符串Salt{get;set;}
}
公共接口任务
{
List GetAll();
用户获取(int-id);
用户CreateOrUpdate(用户用户);
无效删除(int-id);
bool验证(字符串用户名、字符串密码);
}
公共类UserTasks:IUserTasks
{
私有只读IRepository用户存储库;
专用只读IValidateHashQuery _validateHashQuery;
公共用户任务(IRepository userRepository、IValidateHashQuery validateHashQuery)
{
_userRepository=userRepository;
_validateHashQuery=validateHashQuery;
} 
公共列表GetAll()
{
返回_userRepository.GetAll().ToList();
}
公共用户Get(int-id)
{
return\u userRepository.Get(id);
}
公共用户CreateOrUpdate(用户)
{
return\u userRepository.SaveOrUpdate(用户);
}
公共无效删除(int-id)
{
var entity=\u userRepository.Get(id);
如果(实体!=null)
{
_userRepository.Delete(实体);
}
} 
公共bool验证(字符串用户名、字符串密码)
{
返回_userRepository.PerformQuery(_validateHashQuery)!=null?true:false;
}
}
是否需要在
任务
实现中实现验证逻辑,或者是否需要在域中创建新的查询对象,并在
任务
实现中使用它

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


罗伯

这是一场由来已久的争论,也是我以前和自己争论过的

以夏普·阿奇为首。它们通过属性解决这些问题,检查它们的DomainSignatureAttrAttribute,以解决对象的持久性唯一性问题

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

我将向您的核心对象中注入一个存储库接口,并在其中执行检查:

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

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

我不明白这怎么会违反任何规则

请注意,IRepository.PerformQuery(IQuery查询)已从SA的最新版本中删除,以便使用

public类ValidateHashQuery:IValidateHashQuery
{
公共bool验证(字符串用户名、字符串密码)
{
ISession nhSession=NHibernateSession.Current;
//您现在有了会话,可以随意运行查询
}
}
公共类UserTasks:IUserTasks
{
私有只读IRepository用户存储库;
专用只读IValidateHashQuery _validateHashQuery;
公共用户任务(IRepository userRepository、IValidateHashQuery validateHashQuery)
{
_userRepository=userRepository;
_validateHashQuery=validateHashQuery;
} 
公共列表GetAll()
{
返回_userRepository.GetAll().ToList();
}
公共用户Get(int-id)
{
return\u userRepository.Get(id);
}
公共用户CreateOrUpdate(用户)
{
return\u userRepository.SaveOrUpdate(用户);
}
公共无效删除(int-id)
{
var entity=\u userRepository.Get(id);
如果(实体!=null)
{
_userRepository.Delete(实体);
}
} 
公共bool验证(字符串用户名、字符串密码)
{
返回_validateHashQuery.Validate(用户名、密码);
}
}
但是看看您的用户任务,它似乎除了调用存储库之外什么都不做,不知道这会带来什么价值,为什么不直接使用存储库呢

验证查询也是如此,您可以将该依赖项添加到控制器中,并从那里直接调用用户验证查询,然后根据结果设置cookie/session。
然后,在执行要求用户登录的任务之前,检查cookie(理想情况下是操作[Autherise]上的某个属性)。根据您的场景,您可能希望在任务本身中拥有该授权。

但是查询对象在哪里?我想这些对象是用来执行自定义查询的…你在说什么?然后遵循与存储库注入完全相同的模式,创建IQuery对象(IUserQueries)并将其注入到用户构造函数中。问题是IQuery接口不支持ExecuteQuery方法的参数。您发送的文章看起来很棒,我将花一些时间阅读。您如何访问可以调用QueryOver方法的对象?您的IUserRepository实现是UserRepository:Respository,IUserRepository,其中Respository是sharp arch的存储库实现。这将为您提供一个nhibernate ISession作为该对象的一部分,因此您只需将其称为.Session.QueryOver()…非常感谢您的示例和解释。我刚刚开始学习Sharp架构和所有相关内容,请原谅我的错误!我刚买了一本书“NHibernate in Action”来了解更多。我将尝试一下您的示例,看看它是如何工作的!
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);
    }
}