【发布时间】:2011-04-15 04:12:13
【问题描述】:
我有一个包含多个服务类的服务程序集。每个类分组一组相关的服务方法。这些服务使用 IoC 和构造函数注入器进行实例化。
如果我有两个服务类有时可能需要调用另一个中的方法,为了避免循环引用,最好的处理方法是什么?
例如,假设来自两个不同服务类的两个服务方法(不一定是最实际的例子,但为了简单起见):
public class UserService
{
public void RegisterUser(User user)
{
// Do a bunch of stuff needed to register a user
// Now call out to permission service to set up basic permissions
_permissionService.SetUpBasicPermissions(user);
}
}
public class PermissionService
{
public void GrantPermission(User user, int PermissionId)
{
// Add user permission to database
// Now call out to user service to do some other stuff on the user
_userService.TakeActionsOnUserAccount(user);
}
}
以下是我可以看到的选项:
考虑到需要在两者之间共享功能,这是服务类应合并为一个类的标志。但是,如果是这样的话,我最终会不会得到一个巨大的服务类?是什么决定了它们应该如何拆分?
不要组合这两个类,而是将共享逻辑的方法移到它们自己的服务类中(将用户和权限特定的逻辑留在它们各自的类中)。如果是这种情况,我最终可能会得到其中几个共享服务,我认为这不是一件好事。
从一项服务到另一项服务所需的任何操作都应移至调用代码。这对我来说似乎有问题,因为我将删除潜在的依赖逻辑,并使其成为另一层的关注点。换句话说,无论我在哪里调用 _userService.RegisterUser(),我现在都必须在每次调用后立即调用 _permissionService.SetUpBasicPermissions()。
允许一个服务调用另一个服务,但不能同时调用两者。如果是这种情况,我该选择哪一个?对于无法调用另一个的逻辑,我该怎么办?
使用委托将依赖的服务方法注入到被调用的服务方法中。 Bleh,这听起来很难看。
这些是我能想到的,但我敢肯定有些我忽略了。
想法?
提前致谢。
【问题讨论】:
标签: design-patterns dependency-injection domain-driven-design inversion-of-control