C# Sharp架构,如何以及在何处实现查询?
我需要帮助为用户实现验证逻辑。我需要检查用户输入的密码是否与SQL Server用户表中的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
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);
}
}