服务/存储库模式和异步的最佳实践等待API

时间:2017-05-06 04:21:15

标签: c# asynchronous asp.net-web-api repository-pattern

我几乎是使用Service / Repository模式的新手。这是我到目前为止的代码:

public interface IRepository<T> where T : class
{
    Task<IEnumerable<T>> GetAll();
}


public interface IUserRepository : IRepository<User>
{

}


public class UserRepository : IUserRepository
    {
        public async Task<IEnumerable<User>> GetAll()
        {
            List<User> lst = new List<User>();
            lst.Add(new User { ID = 1, Code = "001", Username = "dfrancisco", Password = "dfrancisco123" });
            lst.Add(new User { ID = 1, Code = "002", Username = "111", Password = "1231!" });
            lst.Add(new User { ID = 1, Code = "003", Username = "22", Password = "asdasd1!" });
            lst.Add(new User { ID = 1, Code = "004", Username = "334", Password = "asdasd1" });
            lst.Add(new User { ID = 1, Code = "005", Username = "55", Password = "13" });

            return lst;
        }
    }


public class UserService : IUserService
    {
        private readonly IUserRepository _userRepository;

        #region Constructors

        /// <summary>
        /// constructor for UserService
        /// </summary>
        /// <param name="UserRepository"></param>
        public UserService(IUserRepository UserRepository)
        {
            _userRepository = UserRepository;
        }

        public async Task<IEnumerable<UserDTO>> GetAll()
        {
            List<User> data = (await _userRepository.GetAll()).ToList();


            List<UserDTO> dtos = new List<UserDTO>();
            foreach (User item in data)
            {
                dtos.Add(new UserDTO { Username = item.Username });
            }

            return dtos;
           // throw new NotImplementedException();
        }
        #endregion
    }

所以,我想知道这是否是使用这种设计模式的正确方法。我在网上看到很多使用此代码返回数据的示例:

return await _repository.GetAll(eppPlanId);

或者这个..

return await Task.Run(() => eppPlanDetails);

我建议的案例只是为了演示所需的随机业务逻辑。所以,我想了解这些方法的不同之处以及我应该使用的是什么。

1 个答案:

答案 0 :(得分:1)

如果您计划并且您可能应该坚持使用异步API,那么您也应该为所有存储库API提供它们。有一个命名约定,用&#34; Async&#34;后缀异步方法。因此,您的方法应命名为&#34; GetAllAsync()&#34;代替。

至于坚持哪种方法 - 无论API是否异步,它几乎都是关键。如果API是异步的(在你的情况下是),你不再需要调用Task.Run():只需在调用API时使用await。 如果GetAll()是非异步的,你会使用Task.Run,​​并直接返回IEnumerable。在这种情况下,为了不阻止线程 - 您可以使用Task.Run在其他任务上启动该工作。