Architecture 我的服务层应该是无状态的吗?

Architecture 我的服务层应该是无状态的吗?,architecture,repository,service-layer,Architecture,Repository,Service Layer,我有一个服务层,它处理例如我的控制器和我的域模型(即:存储库、实体等)之间的关系 在我的服务中,我有一个“获取”实体的方法,比如getArticles,但我需要返回数组结果或对象集合 因此,我在我的方法getArticles($array=false)中添加了一个参数(实际上我的服务不强制转换任何对象,它是由存储库完成的,但我需要为我的API提供该选项) 我的服务越来越大,我想知道在我的方法参数中定义它是否是个好主意,我认为这是因为我认为我的服务应该是无状态的,但我想知道在我的服务中有一个基本上

我有一个服务层,它处理例如我的控制器和我的域模型(即:存储库、实体等)之间的关系

在我的服务中,我有一个“获取”实体的方法,比如
getArticles
,但我需要返回数组结果或对象集合

因此,我在我的方法
getArticles($array=false)中添加了一个参数(实际上我的服务不强制转换任何对象,它是由存储库完成的,但我需要为我的API提供该选项)

我的服务越来越大,我想知道在我的方法参数中定义它是否是个好主意,我认为这是因为我认为我的服务应该是无状态的,但我想知道在我的服务中有一个基本上执行
setUseArray($flag)的方法是否更好
并在我的服务代理存储库时向存储库提供该标志

同样,如果我使用我的服务返回分页结果,我应该在每个方法中设置页面和项目计数,还是应该在我的服务中使用全局方法来实现这一点


有什么反馈吗?

和往常一样,视情况而定。这主要取决于服务对象是否将被并发使用。一般来说,使用参数传递所有内容似乎更灵活。将方法参数包装到
请求
实体将避免客户端与方法签名的紧密耦合:

class request { 
    bool getArrayInsteadOfCollection;
    int pageNumber;
    int itemsPerPage;
}        
我假设您有一个web应用程序,并且服务对象只存在于请求上下文中。在这种情况下,您可以安全地选择使“重复”参数服务对象化。看起来也不错-

getArticles(filterParam) {
    //combine function and service-object-level parameters.
    repository.load(fitler = filterParam, itemsPerPage = this.itemsPerPage...)
}

在我看来,由于灵活性和副作用最小化,传递参数更可取。

我不完全理解你的想法,你的意思是我应该有一个像
setRequest(Request$Request)
这样的服务方法,我需要在每个方法调用中设置它,然后在我的每个方法中使用这个对象吗?@Trent-嗯,否则。我建议您将请求传递给每个服务方法。请求只是包装了一些特定的参数,所以当您从请求中添加或删除某些内容时,这不会影响您的方法签名。