編寫從存儲庫中檢索數據的服務層方法的最佳實踐是什麼?服務應該有多少個GET方法?
比方說,我們有兩種型號:Team
和User
(用戶是一個團隊的一部分):
public class User {
public int Id { get; set; }
public string Name { get; set; }
public int TeamId { get; set; }
public virtual Team Team { get; set; }
public bool Active { get; set; }
}
public class Team {
public int Id { get; set; }
public string Name { get; set; }
public bool Active { get; set; }
}
如果我想寫的服務,通過各種條件的儲存庫檢索用戶數據,我必須編寫多種方法來獲取用戶,例如getAll
,getAllByName
,getAllActiveByName
,getAllActiveByTeamId
,getAllActiveByNameAndTeamId
等?
public IEnumerable<User> GetAll()
{
return _repository.GetAll();
}
public IEnumerable<User> GetAllActiveByName(string name)
{
return _repository.GetBy(u => u.Name == name && u.Active);
}
public IEnumerable<User> GetAllActiveByNameAndTeamId(string name, int teamId)
{
return _repository.GetBy(u => u.Name == name && u.Active && u.TeamId == teamId);
}
這些只是簡單的例子,但在現實生活中,我們可以最終有幾十不同場景,服務方法時,模型比較複雜。
或者,也許這是最好有一個GetBy
方法會返回基於所提供的過濾器的用戶?我使用的通用Repository模式和實施GetBy服務方法的時候,我可以用GetBy方法:
public IEnumerable<User> GetBy(Expression<Func<User, object>>filter)
{
return _usersRepository.GetBy(filter);
}
有了這個我就不用寫數萬「複製」的方法對所有的場景。 那麼這將是控制器的責任來設置過濾器:
public ViewResult Index(int teamId = 0){
//[...]
var users = _usersService.GetBy(u => u.IsActive && u.teamId == teamId);
//[...]
}
上有什麼想法?
擁有Google for「通用資源庫接口c#」。這讓你知道你需要什麼。 –
@WimOmbelets我正在使用通用的存儲庫模式,我知道我需要在存儲庫中檢索數據。問題是關於檢索數據的SERVICE層方法。請閱讀其他評論。更新了問題以避免誤解。 –