Architecture 面向服务的架构的最佳实践&;建议的最大行数

Architecture 面向服务的架构的最佳实践&;建议的最大行数,architecture,application-design,Architecture,Application Design,希望这不会成为个人观点,而是解决我和同事关于应用程序设计的争论 我们为数据层使用存储库模式,为应用业务逻辑使用服务。一个服务中可能有一个或多个存储库。让我们举一个例子(我不为学校工作,但这是一个简单的例子): 我的存储库可以包括: SchoolRepository ClassRepoistory DepartmentRepository TutorRepository TutorDepartmentRepository TutorSkillsRepository StudentRepositor

希望这不会成为个人观点,而是解决我和同事关于应用程序设计的争论

我们为数据层使用存储库模式,为应用业务逻辑使用服务。一个服务中可能有一个或多个存储库。让我们举一个例子(我不为学校工作,但这是一个简单的例子):

我的存储库可以包括:

SchoolRepository
ClassRepoistory
DepartmentRepository
TutorRepository
TutorDepartmentRepository
TutorSkillsRepository
StudentRepository
StudentClassRepository
因此,在我看来,我有三种服务(我的例子是c#,但这适用于任何语言):

现在,在我的示例中,
TutorService
可能需要来自
DepartmentRepository
的数据,
StudentService
也可能需要来自
ClassRepository
的数据。我的论点是,如果您需要
ClassRepository
中的
Class
对象,则应从
SchoolService
中检索该对象,并且该对象应作为参数传递,如下所示:

// School service created by DI framework
var class = schoolService.GetClassById(1);

// Student service created by DI framework
var student = studentService.GetStudentById(1);
var studentClasses = studentService.GetStudentClasses(student, class);

我在这篇文章的标题上加上了另一个关于班级最大规模的问题。我建议这应该不超过500行(包括大括号{},新的行以使其可读,等等),因为这使它更易于管理。我是在胡说八道,还是我的想法有点道理?

你把这篇文章称为SOA问题,但你的设计根本不是。您有一个紧密耦合的应用程序,其中每个组件对其他组件都有很好的了解。事实上,这些都是直接引用的对象


这并不一定是一件坏事,因为对于小型系统来说,整体是一种可行的选择,但它不是SOA。虽然如果我真的设计了一个如上所述大小的系统,我可能会尝试简化它,因为这里的“分层”带来了大量的开销和很少的好处(因为紧密耦合)

Hmmmmm,但我曾经非常担心有人会走这条路——我想在我的帖子中提到一些这方面的内容。我不想费心提及使对象松散耦合,相反,我想关注天气是否是一个好主意,在许多服务上使用多个存储库,或者确保存储库只在on服务中使用。这有意义吗?您似乎为每个表定义了一个存储库-如果我要使用存储库,那么每个服务都会有一个存储库,用于抽象与服务相关的表。我还会保留每个服务,以便它能够处理自己的表(而不是共享表)。因此,需要明确的是,你会有一个SchoolService句柄SchoolRespository和ClassService句柄ClassRepository,等等?如果是这样的话,这不是很极端吗?对于这个例子,我可能会有教师、学生和学校服务机构——假设导师和学生除了被分配到课堂之外还有一些商业逻辑。每个存储库都有一个存储库来处理它所包含的表。如果他们不带来新的东西,那么创造大量的服务是没有意义的。为了使SOA成为有效的服务,服务应该与消息而不是类依赖性进行通信(同样,构建一个包含大量类的整体并不一定不好,这不是SOA),感谢您的回答和评论,但我认为您没有涵盖我问题中的所有内容。我的问题是关于在多个服务上使用同一个存储库,以及查看服务的典型行号。
// School service created by DI framework
var class = schoolService.GetClassById(1);

// Student service created by DI framework
var student = studentService.GetStudentById(1);
var studentClasses = studentService.GetStudentClasses(student, class);