Onion Architecture中的登录过程

时间:2017-04-16 02:22:04

标签: c# asp.net-core onion-architecture

我想在洋葱架构中实现登录过程。我无法理解如何正确地解决这个问题。下面是我的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);
    }

目前我能想到的只是返回所有用户条目然后搜索列表,但我想这不是很有效。谢谢!

1 个答案:

答案 0 :(得分:1)

基本上,您首先会使用前面提到的GetByPredicate方法扩展您的存储库,该方法基本上只是SingleOrDefaultFirstOrDefault的包装器(或其他采用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表达式,因此不要使用复杂的条件。只使用我上面展示过的简单条件。