C# 具有通用工作单元C的模拟通用存储库#

C# 具有通用工作单元C的模拟通用存储库#,c#,entity-framework,asp.net-core,moq,C#,Entity Framework,Asp.net Core,Moq,我有这样一个通用存储库: public class GenericRepository<TEntity> : IRepository<TEntity> where TEntity : class { private readonly DbContext _context; private DbSet<TEntity> _dbSet; public GenericRepository(DbContext context) {

我有这样一个通用存储库:

public class GenericRepository<TEntity> : IRepository<TEntity> where TEntity : class
{

    private readonly DbContext _context;
    private DbSet<TEntity> _dbSet;

    public GenericRepository(DbContext context)
    {
      _context = context;
      _dbSet = context.Set<TEntity>();
    }

    public virtual async Task<IEnumerable<TEntity>> Get(Expression<Func<TEntity, bool>> filter = null, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
       string includeProperties = "")
    {
      IQueryable<TEntity> query = _dbSet;

      if (filter != null)
      {
        query = query.Where(filter);
      }

      foreach (var includeProperty in includeProperties.Split
          (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
      {
        query = query.Include(includeProperty);
      }

      if (orderBy != null)
      {
        return await orderBy(query).ToListAsync<TEntity>();
      }

      return await query.ToListAsync<TEntity>();
    }
}
public class GenericUnitOfWork<TContext> : IUnitOfWork<TContext>, IDisposable where TContext : DbContext
{
    #region Private Member Variables
    private TContext _context = null;

    private Dictionary<Type, object> _repositories = new Dictionary<Type, object>();
    #endregion

    #region Constructors
    public GenericUnitOfWork(TContext context)
    {
        _context = context;
    }
    #endregion

    #region Public Properties
    public TContext Context
    {
      get
      {
        return _context;
      }
    }
    #endregion

    #region Public Methods
    public IRepository<TEntity> Repository<TEntity>() where TEntity : class
    {
      if (_repositories.Keys.Contains(typeof(TEntity)))
      {
        return _repositories[typeof(TEntity)] as GenericRepository<TEntity>;
      }

      GenericRepository<TEntity> repo = new GenericRepository<TEntity>(_context);
      _repositories.Add(typeof(TEntity), repo);
      return repo;
    }
} 
公共类GenericRepository:i存储,其中tenty:class
{
私有只读DbContext\u context;
私有数据库集_DbSet;
公共GenericRepository(DbContext上下文)
{
_上下文=上下文;
_dbSet=context.Set();
}
公共虚拟异步任务Get(表达式filter=null,Func orderBy=null,
字符串includeProperties=“”)
{
IQueryable查询=_dbSet;
if(过滤器!=null)
{
query=query.Where(过滤器);
}
foreach(includeProperty.Split中的var includeProperty
(新字符[]{',},StringSplitOptions.RemoveEmptyEntries)
{
query=query.Include(includeProperty);
}
if(orderBy!=null)
{
return wait orderBy(query.ToListAsync();
}
return wait query.ToListAsync();
}
}
像这样的通用工作单元:

public class GenericRepository<TEntity> : IRepository<TEntity> where TEntity : class
{

    private readonly DbContext _context;
    private DbSet<TEntity> _dbSet;

    public GenericRepository(DbContext context)
    {
      _context = context;
      _dbSet = context.Set<TEntity>();
    }

    public virtual async Task<IEnumerable<TEntity>> Get(Expression<Func<TEntity, bool>> filter = null, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
       string includeProperties = "")
    {
      IQueryable<TEntity> query = _dbSet;

      if (filter != null)
      {
        query = query.Where(filter);
      }

      foreach (var includeProperty in includeProperties.Split
          (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
      {
        query = query.Include(includeProperty);
      }

      if (orderBy != null)
      {
        return await orderBy(query).ToListAsync<TEntity>();
      }

      return await query.ToListAsync<TEntity>();
    }
}
public class GenericUnitOfWork<TContext> : IUnitOfWork<TContext>, IDisposable where TContext : DbContext
{
    #region Private Member Variables
    private TContext _context = null;

    private Dictionary<Type, object> _repositories = new Dictionary<Type, object>();
    #endregion

    #region Constructors
    public GenericUnitOfWork(TContext context)
    {
        _context = context;
    }
    #endregion

    #region Public Properties
    public TContext Context
    {
      get
      {
        return _context;
      }
    }
    #endregion

    #region Public Methods
    public IRepository<TEntity> Repository<TEntity>() where TEntity : class
    {
      if (_repositories.Keys.Contains(typeof(TEntity)))
      {
        return _repositories[typeof(TEntity)] as GenericRepository<TEntity>;
      }

      GenericRepository<TEntity> repo = new GenericRepository<TEntity>(_context);
      _repositories.Add(typeof(TEntity), repo);
      return repo;
    }
} 
公共类GenericUnitOfWork:IUnitOfWork,IDisposable其中TContext:DbContext
{
#区域私有成员变量
私有TContext_context=null;
私有词典_repositories=新词典();
#端区
#区域构造函数
公共GenericUnitOfWork(TContext上下文)
{
_上下文=上下文;
}
#端区
#区域公共财产
公共上下文
{
得到
{
返回上下文;
}
}
#端区
#区域公共方法
公共IRepository存储库(),其中tenty:class
{
if(_repositories.Keys.Contains(typeof(tenty)))
{
将(类型(tenty))存储库返回为一般存储库;;
}
一般保存回购=新的一般保存(_上下文);
_添加(类型(TEntity),回购);
回购回报;
}
} 
和用户服务:

public class UserService : IUserService
{

    private readonly IUnitOfWork<TASConfigDBContext> _unitOfWork;
    private readonly IJwtFactory _jwFactory;
    private readonly ITokenFactory _tokenFactory;



    public UserService(IUnitOfWork<TASConfigDBContext> unitOfWork, IJwtFactory jwtFactory, ITokenFactory tokenfactory)
    {
      _unitOfWork = unitOfWork;
      _jwFactory = jwtFactory;
      _tokenFactory = tokenfactory;
    }

    public bool IsUserAuthenticated(string userName, string password)
    {
      var user = _unitOfWork.Repository<Users>().GetQuery().Where(x => string.Equals(x.Name, userName.Trim(), StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();

      // ensure we have a user with the given user name
      if (user != null && user.Password == password)
      {
        return true;
      }

      return false;
    }
}
public类用户服务:IUserService
{
私人只读i工作单元(unitof工作单元);;
私人只读IJwtFactory_jwFactory;
私有只读ITokenFactory\u tokenFactory;
公共用户服务(IUnitOfWork、IJwtFactory、jwtFactory、ITokenFactory、tokenfactory)
{
_unitOfWork=unitOfWork;
_JWFFactory=jwtFactory;
_令牌工厂=令牌工厂;
}
public bool IsUserAuthenticated(字符串用户名、字符串密码)
{
var user=_unitOfWork.Repository().GetQuery().Where(x=>string.Equals(x.Name,userName.Trim(),StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
//确保我们有一个具有给定用户名的用户
if(user!=null&&user.Password==Password)
{
返回true;
}
返回false;
}
}
AuthController:

public class AuthController : ControllerBase
{
    #region Private Member Variables
    private readonly IUserService _userService;
    private readonly ILogger<AuthController> _logger;
    #endregion

    #region Constructors

    /// <summary>
    /// Initializes a new instance of the <see cref="AuthController"/> class.
    /// </summary>
    /// <param name="userService">userService DAL layer.</param>
    /// <param name="logger">nlog logger.</param>
    public AuthController(IUserService userService, ILogger<AuthController> logger)
    {
      _userService = userService;
      _logger = logger;
    }
    #endregion

    #region Public Methods

    /// <summary>
    /// Returns true if login is successful.
    /// </summary>
    /// <remarks>
    /// Sample login:
    ///
    ///     POST /auth/login
    ///     {
    ///        "Username": "administrator",
    ///        "Password": ""
    ///     }.
    ///
    /// </remarks>
    /// <param name="login">The username and password.</param>
    /// <returns>returns a token for validated user.</returns>
    /// <response code="200">Success: Returns a token for a validated user.</response>
    /// <response code="400">Bad request.</response>
    /// <response code="401">Unauthorized: username and password doesn't match.</response>
    [AllowAnonymous]
    [HttpPost("login")]
    [EnableCors("AllowOrigin")]
    [Produces("application/json")]
    [ProducesResponseType(typeof(ResponseMessage), 200)]
    [ProducesResponseType(typeof(ResponseMessage), 400)]
    [ProducesResponseType(typeof(ResponseMessage), 401)]
    public async Task<ActionResult> Post([FromBody] LoginModel login)
    {
      HttpStatusCode statusCode;

      ActionResult response;
      ResponseMessage tokenResponseMessage;
      ResponseToken responseToken;

      if (login == null)
      {
        tokenResponseMessage = new ResponseMessage(false, null, new Message(HttpStatusCode.BadRequest));

        _logger.LogError($"The Login model is null. {(LoginModel)null}");
        response = BadRequest(tokenResponseMessage);
      }
      else if (!ModelState.IsValid)
      {
        var errors = new Hashtable();
        foreach (var pair in ModelState)
        {
          if (pair.Value.Errors.Count > 0)
          {
            errors[pair.Key] = pair.Value.Errors.Select(error => error.ErrorMessage).ToList();
          }
        }

        tokenResponseMessage = new ResponseMessage(false, errors, new Message(HttpStatusCode.BadRequest));
        _logger.LogError($"The ModelState is invalid. {errors} ");

        response = BadRequest(tokenResponseMessage);
      }
      else
      {
        if (_userService.IsUserAuthenticated(login.UserName, login.Password))
        {
          _logger.LogInformation($"Returned with valid username: {login.UserName}");
          responseToken = await _userService.GetResponseToken(login.UserName);

          _logger.LogInformation($"Response token generated for: {login.UserName}");
          statusCode = HttpStatusCode.OK;

          tokenResponseMessage = new ResponseMessage(true, responseToken, new Message(statusCode));

          // generate access token
          response = Ok(tokenResponseMessage);
        }
        else
        {
          _logger.LogWarning($"No username for userid : {login.UserName} found");
          statusCode = HttpStatusCode.Unauthorized;
          tokenResponseMessage = new ResponseMessage(false, null, new Message(statusCode, "Incorrect username or password"));

          response = Unauthorized(tokenResponseMessage);
        }
      }

      return response;
    }
公共类AuthController:ControllerBase
{
#区域私有成员变量
专用只读IUserService\u userService;
专用只读ILogger\u记录器;
#端区
#区域构造函数
/// 
///初始化类的新实例。
/// 
///用户服务DAL层。
///nlog记录器。
公共AuthController(IUserService用户服务、ILogger记录器)
{
_userService=userService;
_记录器=记录器;
}
#端区
#区域公共方法
/// 
///如果登录成功,则返回true。
/// 
/// 
///登录示例:
///
///POST/auth/login
///     {
///“用户名”:“管理员”,
///“密码”:”
///     }.
///
/// 
///用户名和密码。
///返回已验证用户的令牌。
///成功:返回已验证用户的令牌。
///请求错误。
///未经授权:用户名和密码不匹配。
[异名]
[HttpPost(“登录”)]
[EnableCors(“AllowOrigin”)]
[产生(“应用程序/json”)]
[产品响应类型(类型(响应消息),200)]
[产品响应类型(类型(响应消息),400)]
[产品响应类型(类型(响应消息),401)]
公共异步任务发布([FromBody]登录模型登录)
{
HttpStatusCode状态码;
行动结果反应;
响应消息令牌响应消息;
响应肯响应肯;
if(login==null)
{
tokenResponseMessage=新的ResponseMessage(false、null、新消息(HttpStatusCode.BadRequest));
_logger.LogError($“登录模型为空。{(LoginModel)null}”);
响应=坏请求(令牌响应消息);
}
如果(!ModelState.IsValid),则为else
{
var errors=新哈希表();
foreach(ModelState中的var对)
{
如果(pair.Value.Errors.Count>0)
{
errors[pair.Key]=pair.Value.errors.Select(error=>error.ErrorMessage.ToList();
}
}
tokenResponseMessage=new ResponseMessage(错误、错误、新消息(HttpStatusCode.BadRequest));
_logger.LogError($“ModelState无效。{errors}”);
响应=坏请求(令牌响应消息);
}
其他的
{
if(_userService.IsUserAuthenticated(login.UserName,login.Password))
{
_logger.LogInformation($”返回了有效的用户名:{login.username});
responseToken=wait_userService.GetResponseToken(login.UserName);
_logger.LogInformation($“为:{login.UserName}生成的响应令牌”);
statusCode=HttpStatusCode.OK;
tokenResponseMessage=新的ResponseMessage(true、responseToken、新消息(statusCode));
//生成访问令牌
响应=Ok(令牌响应消息);
}
其他的
{
_logger.LogWarning($“找不到用户名:{login.username}”);
statusCode=HttpStatusCode.未经授权;
tokenResponseMessage=new ResponseMessage(假、空、新消息(状态码,“不正确的用户名或密码”);
响应=未授权(令牌响应消息);
}
}
返回响应;
}