3

我有一个服务程序集与多个服务类。每个班级分组一组相关的服务方法。这些服务使用IoC和构造函数注入器实例化。避免循环引用服务和DI

如果我有两个服务类有时需要在另一个中调用方法,那么为了避免循环引用,处理这些方法的最佳方法是什么?

例如,假设从两个不同的服务类两种服务方法(不一定是最实际的例子,但为了简单起见):

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); 
    } 
} 

这里是选择我可以看到:

  1. 考虑到需要在这两者之间共享功能,这是服务类应该合并到一个类中的一个标志。但是,如果是这种情况,我最终是否会得到一个巨大的服务类?什么决定了他们应该如何分手?

  2. 不要合并这两个类,而是将共享逻辑的方法移动到它们自己的服务类中(将用户和权限特定的逻辑留在其各自的类中)。如果是这种情况,我可能会得到几个这样的共享服务,我认为这不是一件好事。

  3. 从一个服务到另一个服务所需的任何操作都应该移到调用代码中。这对我来说似乎有问题,因为我将删除潜在的依赖逻辑,并使其成为另一层的关注点。换句话说,在我调用_userService.RegisterUser()的地方,我现在总是必须在每次调用之后立即调用_permissionService.SetUpBasicPermissions()。

  4. 允许一个服务调用另一个服务,但不能同时调用其他服务。如果是这种情况,我选择哪一个?我该怎么做w /那个不能打另一个的逻辑呢?

  5. 使用委托将相关服务方法注入到被调用的服务方法中。 Bleh,这听起来很难看。

这些是我能想到的,但我确信有一些我可以忽略。

想法?

在此先感谢。

+1

相关:http://stackoverflow.com/questions/1453128/is-there-a-good-proper-way-of-solving-the-dependency-injection-loop-problem-in-th – 2011-04-15 05:35:06

+1

相关:http ://stackoverflow.com/questions/2608875/bad-design-constructor-of-composition-uses-this – 2011-04-15 05:35:27

+1

相关:http://stackoverflow.com/questions/1356304/are-circular-class-dependencies-bad-from -a-coding-style-point-of-view – 2011-04-15 05:35:59

回答

1

如果你想拥有这两种服务相互引用,你将需要使用属性注入(或方法),而不是构造函数,以便他们能够以前被传递到其他类完全建立。

只要有一个服务的设计在某些情况下调用另一个服务,只要操作的逻辑流程合理就可以了。虽然可能试图将其保持在最低限度是一种更好的设计,因为增加依赖性会增加耦合性,并且必须在单元测试中更紧密地映射行为。

+0

我最终意识到我最大的依赖是我需要能够从我的大部分服务中检查权限,所以我把它解决了。我要尽量避免带有循环引用。到目前为止,我已经能够不损害我的设计。 – 2011-04-28 19:57:31

2
  1. SRP原理states that every object should have a single responsibility所以合并类是不好的。
  2. 这就是发明的方式继承方式,使用抽象类通用代码并专门化后(不使用引用)
  3. 依赖逻辑不好,RegisterUser应该只做那个注册,不给权限。将依赖关系移动到调用层是可以的。
  4. 只有在必须的情况下才能做到这一点,在您进行abstrat课程后应该清楚一点。尽管尝试对象组合。
  5. 这就是所谓的容器,你应该了解它后,你读好:http://www.potstuck.com/2009/01/08/php-dependency-injection

关于循环引用,OOP的原则,只能说避免抽象和具体类之间的循环引用(好莱坞原则),这是不是这样。可以像你一样使用它们。

但是,您正在使用非常好的依赖注入,因此您可以提取SetUpBasicPermissions并将它放在类之外。

objUser = new User(); 
objUserService.RegisterUser(objUser); 
objPermissionService.SetUpBasicPermissions(objUser);