리포지토리에서 데이터를 검색하는 서비스 계층 메서드를 작성하는 모범 사례는 무엇입니까?서비스에 몇 가지 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
제공된 필터를 기반으로 사용자를 반환하는 방법을 사용하는 것이 더 좋을 수도 있습니다. 나는 일반 저장소 패턴을 사용하고 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);
//[...]
}
어떤 생각 : 는 그런 다음 필터를 설정하는 컨트롤러의 책임 것입니까?
에는 "일반 저장소 인터페이스 C#"에 대한 Google이 있습니다. 그것은 당신에게 당신이 필요로하는 것에 대한 아이디어를줍니다. –
@WimOmbelets 일반적인 저장소 패턴을 사용하고 있으며 데이터를 검색하기 위해 저장소에서 필요한 메서드를 알고 있습니다. 질문은 데이터를 검색하는 SERVICE 계층 메서드에 대한 것입니다. 다른 의견을 읽으십시오. 오해를 피하기 위해 질문을 업데이트했습니다. –