我有以下服务类别:
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();
}
}
}
这些服务类中的每一个都由 IoC 容器实例化,并且不存在功能问题,但对我来说,这种方法存在潜在的设计缺陷,我想知道是否有更有意义的替代方法。
正如有人已经指出的那样,问题不在于 DI 容器的限制,而在于您的设计。
我明白你有一个单独的原因UserService
and a JobService
其中包含彼此的引用。这是因为两者UserService
and 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
}
}
通过这种方式,您不会遇到任何循环引用问题,并且您将拥有一个位置来包含需要由不同服务重用的逻辑。
另外,我更喜欢拥有彼此完全隔离的服务。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)