我几乎是使用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);
我建议的案例只是为了演示所需的随机业务逻辑。所以,我想了解这些方法的不同之处以及我应该使用的是什么。
答案 0 :(得分:1)
如果您计划并且您可能应该坚持使用异步API,那么您也应该为所有存储库API提供它们。有一个命名约定,用&#34; Async&#34;后缀异步方法。因此,您的方法应命名为&#34; GetAllAsync()&#34;代替。
至于坚持哪种方法 - 无论API是否异步,它几乎都是关键。如果API是异步的(在你的情况下是),你不再需要调用Task.Run():只需在调用API时使用await。 如果GetAll()是非异步的,你会使用Task.Run,并直接返回IEnumerable。在这种情况下,为了不阻止线程 - 您可以使用Task.Run在其他任务上启动该工作。