Ada*_*itt 1 c# dependency-injection circular-dependency inversion-of-control
我有以下服务类:
public class JobService {
private UserService us;
public JobService (UserService us) {
this.us = us;
}
public void addJob(Job job) {
// needs to make a call to user service to update some user info
// similar dependency to the deleteUser method
}
}
public class UserService {
private JobService js;
public UserService(JobService js) {
this.js = js;
}
public void deleteUser(User u) {
using (TransactionScope scope = new TransactionScope()) {
List<IJob> jobs = jobService.findAllByUser(u.Id);
foreach (IJob job in jobs) {
js.deleteJob(job);
}
userDao.delete(user);
scope.Complete();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这些服务类中的每一个都是由IoC容器实例化的,并且没有功能问题,但对我而言,这种方法存在潜在的设计缺陷,我想知道是否存在更有意义的替代方法.
正如有人已经指出的那样,问题不在于DI容器的限制,而在于您的设计.
我看到你有一个单独的UserService和一个JobService包含对彼此的引用的原因.这是因为两者UserService 并JobService包含需要其它服务作为参考一些逻辑(添加作业需要添加用户,等等).但是,我认为你不应该引用另一个服务.相反,您应该在服务后面使用另一层抽象,服务将用于通用逻辑.因此,服务将包含不能(不应该)重用的逻辑,并且帮助程序将包含共享逻辑.
例如:
public class UserHelper{
//add all your common methods here
}
public class JobService {
private UserHelper us;
public JobService (UserHelper us) {
this.us = us;
}
public void addJob(Job job) {
// calls helper class
}
}
public class UserService {
public UserService(UserHelper js) {
this.js = js;
}
public void deleteUser(User u) {
// calls helper class
}
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您将不会遇到循环引用的任何问题,并且您将拥有一个包含需要由不同服务重用的逻辑的位置.
此外,我更喜欢拥有彼此完全隔离的服务.
| 归档时间: |
|
| 查看次数: |
1185 次 |
| 最近记录: |