Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一个服务应该有多少个GET方法?_C#_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

C# 一个服务应该有多少个GET方法?

C# 一个服务应该有多少个GET方法?,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,编写从存储库检索数据的服务层方法的最佳实践是什么 假设我们有两个模型:团队和用户(用户是团队的一部分): 公共类用户{ 公共int Id{get;set;} 公共字符串名称{get;set;} public int TeamId{get;set;} 公共虚拟团队{get;set;} 公共bool活动{get;set;} } 公开课小组{ 公共int Id{get;set;} 公共字符串名称{get;set;} 公共bool活动{get;set;} } 如果我想编写服务以按各种条件从存储库检索用

编写从存储库检索数据的服务层方法的最佳实践是什么

假设我们有两个模型:
团队
用户
(用户是团队的一部分):

公共类用户{
公共int Id{get;set;}
公共字符串名称{get;set;}
public int TeamId{get;set;}
公共虚拟团队{get;set;}
公共bool活动{get;set;}
}
公开课小组{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共bool活动{get;set;}
}
如果我想编写服务以按各种条件从存储库检索用户数据,我是否必须编写多种方法来获取用户,例如
getAll
getAllByName
getAllActiveByName
getAllActiveByTeamId
getAllActiveByNameAndTeamId
,等等

public IEnumerable GetAll()
{
返回_repository.GetAll();
}
公共IEnumerable GetAllActiveByName(字符串名称)
{
返回_repository.GetBy(u=>u.Name==Name&&u.Active);
}
public IEnumerable GetAllActiveByNameAndTeamId(字符串名称,int-teamId)
{
返回_repository.GetBy(u=>u.Name==Name&&u.Active&&u.TeamId==TeamId);
}
这些只是简单的例子,但在现实生活中,当模型更复杂时,我们最终可以为不同的场景提供数十种服务方法

或者最好有一个
GetBy
方法,根据提供的过滤器返回用户?我使用通用存储库模式,在实现GetBy服务方法时可以使用GetBy方法:

public IEnumerable GetBy(Expressionfilter)
{
return\u usersRepository.GetBy(过滤器);
}
有了它,我就不必为所有场景编写数十个“重复”的方法。 然后,控制器应负责设置过滤器:


对此有何想法?

我认为您应该拥有与场景相同的查询方法

通过这种方式,您可以优化单个查询,例如使用预先计算的视图。 您的一些查询可能使用急切加载,其他查询可能使用惰性加载

另外,如果总是返回
IQueryable
如何测试它?您的服务将只有一种方法
GetAll
,并且非常贫乏,您可以直接在控制器中摆脱它并使用存储库

反对
GetAll
的另一个论点是,任何人都可以在UI中执行任何查询

考虑阅读关于CQR的文章

或者最好有一个只返回的getAll方法 活动用户,然后在控制器中使用lambda表达式

不会。这种查询只适用于内存中的静态数据。假设您有一些应用程序级数据,并且在一定时间内不会更改,那么您不是每次都查询它,而是第一次获取所有数据,然后将其放入本地服务器缓存中。然后将其用于下一个同步请求。但这种方法不适用于变化剧烈的动态数据。此外,此查询的性能取决于它返回的记录数,所以有时可能会产生非常糟糕的性能

我是否必须编写多个方法来获取用户,例如getAll, getAllByName、getAllActiveByName、getAllActiveByTeamId、, 获取所有活动的域名和团队ID等


那更好。这种方法将为您提供按需加载的自由,这意味着在需要时加载必要的数据,而不是获取所有数据并将其丢弃。

使用谷歌搜索“通用存储库接口c”。这让您对所需内容有了一个概念。@WimOmbelets我使用的是通用存储库模式,我知道在存储库中检索数据需要什么方法。问题是关于检索数据的服务层方法。请阅读其他评论。更新了问题以避免误解。GetAll不是服务中的唯一方法。还有其他处理业务逻辑的方法。我的文章是关于检索实体“列表”的方法的。无论如何,我都要使用GetAll,所以我的问题是“我是否需要实现其他方法”,例如GetAllByThis和IsAnd,如果GetAll已经存在,我可以直接使用它。性能可能是编写其他方法的好理由。
public ViewResult Index(int teamId = 0){
    //[...]
    var users = _usersService.GetBy(u => u.IsActive && u.teamId == teamId);
    //[...]
}