问题标签 [service-layer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
110 浏览

zend-framework - 您如何处理用户实体及其连接状态?

我目前正在使用 Zend Framework 和 Doctrine 2 开发一个项目,我对这两个工具都非常满意,但我想知道如何使用这个特殊的 User 对象,它共享数据库数据、会话数据(授权、参数、acl 等)

我经常看到这种实现:

对我来说,问题是我的 User 类是 Doctrine 使用的实体,这不是问题,但如果我的 User 具有一些复杂的角色和/或权限,它可能会添加一些业务逻辑。

顺便说一句,我不知道为什么(只是一种感觉,也许是错误的)但它看起来不是一个好主意,我很确定它有设计限制。

目前我的想法是使用 UserService,我已经尝试将这样的层用于我的其他实体,它看起来非常有趣。

类似的东西怎么样:

它可以让我使用其他服务,例如 IdentificationService,它可以将“用户”(或任何其他可能被授权的“资源”)存储到会话中并检查授权。

这同样适用于 AuthorizationService ,方法如下:

您对这种实施方式有任何反馈吗?和/或任何例子?

你觉得呢?你有没有什么想法?

谢谢你。

0 投票
2 回答
220 浏览

php - 我的服务应该实现事务和提交方法吗?

假设我想在我的UsersController.

在我的UsersController我做:

如果有很多用户,它可能会变慢,因为 UserService::updateUser 方法只是执行persist()/flush()

所以我想知道做这样的事情是否是个好主意:

然后在我的UsersController我可以做:

你有什么想法?

0 投票
1 回答
183 浏览

php - 使用服务层时如何处理错误?

在我的 Zend Framework 项目中,我使用了一个服务层,但是我真的不知道在哪里处理错误。

例如,假设我有一个UserService::updateUser($data);

如果我有:

id 为 2 的用户不存在?

您将在哪里以及如何处理此类错误?

0 投票
1 回答
224 浏览

php - 使用 Service Locator 将容器实例提供给 Service 是错误的吗?

我正在使用服务层,然后,我有很多服务,例如:

  • 用户服务
  • 文章服务
  • 评论服务
  • 授权服务

有时我需要使用另一个服务中的服务。

目前,我正在使用 sfServiceContainer 进行依赖注入,并在我的一些服务中注入我的 Doctrine 2 实体管理器,但是,我正在考虑切换并注入容器实例以便能够获取任何服务和 EntityManager。

但我被困住了,我不确定这是一个好主意。

0 投票
6 回答
507 浏览

php - 我的服务方法签名应该如何?

我正在使用一个服务层,直到现在我使用了一个 ServiceObject(它实现了 ArrayAccess、Iterator、Countable),但我想知道这是否是个好主意。

你会怎么做:

或者

在哪里$data

ServiceObject 的好处是为每个方法提供一个公共签名,但是有时它看起来效率不高,并且没有被广泛使用,它失去了它的兴趣。

任何反馈?

0 投票
0 回答
201 浏览

php - 你会使用断言还是动态 Acl?

我正在实现一个AuthorizationService,基本上它扩展Zend_Acl和覆盖authenticate()方法以使用我自己的适配器。

假设我有User, Article, ArticleComment, ArticleVote, CommentVote.

我的规则很简单:

  • 会员可以编辑自己的文章
  • 会员可以对任何条款进行投票
  • 客人不能对评论投票
  • 客人每天最多只能投 10 票。

但是,我不确定如何实现这一点,对于最后的规则,很容易,它应该是一个断言,但是,可以编辑自己的文章的成员呢?

我应该创建一个动态 Acl,并创建一个像“Article-545”和一个角色“User-5656”这样的资源,然后创建一个 Acl 规则,还是有一个更通用的“文章”资源和一个通用角色“用户”,并使用断言授权用户 545 编辑文章 5656?

你是怎么做的,有什么建议吗?

0 投票
4 回答
1504 浏览

c# - 我应该如何将我的选择语句包装在事务中?

我要用 nhibernate profiler 扔掉我的网站,我收到了这条消息

警告:不鼓励使用隐式事务

http://nhprof.com/Learn/Alerts/DoNotUseImplicitTransactions

我看到它们出现在每一个 select 语句中。

我是否应该像提交时一样使用事务来包装我的 GetOrderHistory?

编辑

我如何将选择语句与事务包装在一起?会是这样吗?但是从不使用“事务”。

编辑

Ninject(也许我可以利用它来帮助我,就像我在获得会话时所做的那样)

编辑 3

如果我这样做

我收到此警报

如果我这样做

我可以摆脱错误,但可以得到意想不到的结果。

例如,当我返回 orderHistory 时,我会遍历所有这些并将“购买日期”转换为用户本地时间。这是通过我为列表创建的扩展方法完成的。

转换后,我将其设置为覆盖对象中的“购买日期”。这样,我不必为字段的一次更改创建新对象。

现在,如果我在调用提交之前进行日期转换,nhibernate 认为我已经更新了对象并需要提交它。

所以我在这个问题上悬赏。

  1. 如何创建我的方法,这样我就不必将每个方法包装在事务中?我已经在我的会话中使用了 ninject,所以也许我可以利用它,但有时我不得不在一个请求中执行多个事务。

所以我不知道每个请求只有一个交易是一个灵魂。

  1. 如何确保我为临时使用而更改的对象不会意外提交?

  2. 我如何才能在我的服务层中使用延迟加载。我不想在事务中包含我的延迟加载内容,因为它通常用于我的服务层。

当您使用存储库模式时,我发现很难找到如何做到这一点的示例。有了这些例子,一切都写在同一个事务中,我不想在我的服务层有事务(这是回购的工作而不是我的业务逻辑)

0 投票
2 回答
228 浏览

php - 在哪里放置 OAuth 逻辑?

我在一个项目中使用 Zend 框架,并且我正在创建一个仅用于身份验证的控制器。在这个项目中,我们将接受用户通过 facebook、twitter、myspace 等其他网站的帐户进行注册。为此,我们将使用 OAuth。但我有一个疑问,我应该把每个 OAuth 站点相关身份验证的逻辑放在哪里?例如只有facebook,在我的控制器中占据了50行代码,这样我的控制器就不会瘦了……

我想知道我应该把这个放在哪里。为每个站点创建一个 Zend_Auth 适配器,只为此创建一个服务,最好的方法是什么?

对不起可怜的英语。:)

0 投票
1 回答
2433 浏览

architecture - 工作范围单位

我有一个将 webforms 用于前端和 mvc 用于管理控制台的解决方案。

两个 UI 都通过 Ninject 使用服务层,我无法解决一个微妙但相当重要的问题。

假设我有一个 CourseService,它根据字符串搜索词返回课程列表 - 该服务返回搜索结果,但我还需要记录进行的搜索以及与该词匹配的课程数量,以用于管理信息目的。

我开始的想法是,工作单元将由 UI 提交,在请求结束时,在页面方法中,例如按钮单击事件。这同样适用于控制器。

这里的问题是我依赖 UI 开发人员在工作单元上调用 Commit() 以便记录搜索。UI 开发人员可以在不调用 commit 的情况下愉快地继续工作,并且会返回结果 - 但不会记录搜索。这导致我决定让服务层控制工作单元的范围。Ninject 将自动将工作单元传递给服务层和存储库实现,这将与我告诉 ninject 根据请求范围创建它实际上是同一个实例。

这是我的图层如何编写的示例...

在上面的评论中,您可以看到我觉得我“应该”在哪里提交我的更改,但我觉得通过允许服务层和存储库实现来控制事务的范围,我可能忽略了一个更大的问题。

除此之外 - 当我的存储库需要保存一个新对象,并以完整的新给定主键返回它时,如果我在返回对象后从 UI 调用 Commit,则不会发生这种情况。所以存储库有时确实需要管理工作单元。

你能看到我的方法有什么直接的问题吗?

0 投票
1 回答
978 浏览

c# - 使用 Ninject 将当前用户注入我的域

我在将当前登录用户注入我的服务层时遇到问题,我正在尝试类似于代码营服务器的东西,但很难弄清楚为什么我的代码不起作用......

我的应用程序:UI 层 -> 连接到域服务 -> 连接到 Repo 层...

Repo 未连接到 UI,所有内容都经过检查验证并从 DomainService 层传回......

我的代码:

//这是在我的域服务中声明的

在我的 Web 应用程序中,我想实现这个服务,然后将它注入到我的服务层中(这就是我卡住的地方):

我想做的是:从身份验证服务中获取登录用户,但是这不起作用,所以我删除了代码......

我绑定 global.asax 中的所有内容,例如:

首先:当我尝试使用使用 IUserSession 的服务时遇到异常,它说请为控制器 x 提供默认的无参数构造函数,但是如果我从域服务中删除引用,一切正常......

服务总监:

有没有更好的方法/更简单的方法来实现这个?

在下面回复的帮助下更新我设法完成了这项工作,如果有人想知道我是如何做到的,我已经上传到 github...

https://gist.github.com/1042173