我想在洋葱架构中实现登录过程。我无法理解如何正确地解决这个问题。下面是我的Repository类,它将与数据库通信。我如何检查电子邮件尚未输入表格。似乎我可以传入的唯一参数是模型对象或来自我的BaseClass的实体。我的Base类只包含Id的字符串。
public class RentalsRepository<T> : IRentalsRepository<T> where T : BaseClass
{
private readonly RentalsDBContext _Context;
private DbSet<T> entities;
string errorMessage = string.Empty;
public RentalsRepository(RentalsDBContext _Context)
{
this._Context = _Context;
entities = _Context.Set<T>();
}
public T Get(string Id)
{
return entities.SingleOrDefault(e => e.Id == Id);
}
目前我能想到的只是返回所有用户条目然后搜索列表,但我想这不是很有效。谢谢!
答案 0 :(得分:1)
基本上,您首先会使用前面提到的GetByPredicate
方法扩展您的存储库,该方法基本上只是SingleOrDefault
或FirstOrDefault
的包装器(或其他采用lambda表达式的LINQ方法/谓语)。您的回购将与此类似:
public class RentalsRepository<T> : IRentalsRepository<T> where T : BaseClass
{
private readonly RentalsDBContext _Context;
private DbSet<T> entities;
string errorMessage = string.Empty;
public RentalsRepository(RentalsDBContext _Context)
{
this._Context = _Context;
entities = _Context.Set<T>();
}
public T Get(string Id)
{
return entities.SingleOrDefault(e => e.Id == Id);
}
public T GetByPredicate(Func<T, bool> predicate)
{
return entities.FirstOrDefault(predicate);
}
}
在您的Businesslogic中,您可以这样调用此方法:
public void PerformLogin(string username, string hashedPassword)
{
var user = _repository.GetByPredicate(x => x.Username == username);
if(user != null)
{
if(user.HashedPassword == hashedPassword)
{
// Login succeeded do all you need to set usersession here
return;
}
}
// If we´ve come this far either there is no user or password was incorrect. We need to inform the user that login hasn´t succeeded
throw new LoginFailedException("Login failed. Username does not exist or password is incorrect.);
}
基本上,您可以随意调用此GetByPredicate
。请考虑每次调用GetByPredicat
都会产生SQL表达式,因此不要使用复杂的条件。只使用我上面展示过的简单条件。