C# 跨多个服务访问公共功能
我目前正在构建一个应用程序,目前我为每个控制器提供一个服务(该服务处理控制器的业务逻辑)。每个服务都有自己的dbcontext 我已经认识到,有几个服务需要执行相同的功能(从数据库中检索相同的数据列表,并在返回它们之前对它们执行相同的逻辑)。因此,理想情况下,我需要一种服务访问公共功能的方法 我的第一个想法是创建一个简单的helper类,每个服务都可以使用这个类,其中包含一些简单的函数,这些函数将dbcontext作为参数之一,这样这些函数就可以执行数据库查询以及逻辑并返回结果C# 跨多个服务访问公共功能,c#,asp.net,asp.net-mvc,entity-framework,entity-framework-6,C#,Asp.net,Asp.net Mvc,Entity Framework,Entity Framework 6,我目前正在构建一个应用程序,目前我为每个控制器提供一个服务(该服务处理控制器的业务逻辑)。每个服务都有自己的dbcontext 我已经认识到,有几个服务需要执行相同的功能(从数据库中检索相同的数据列表,并在返回它们之前对它们执行相同的逻辑)。因此,理想情况下,我需要一种服务访问公共功能的方法 我的第一个想法是创建一个简单的helper类,每个服务都可以使用这个类,其中包含一些简单的函数,这些函数将dbcontext作为参数之一,这样这些函数就可以执行数据库查询以及逻辑并返回结果 这是个好主意吗?
这是个好主意吗?通过这种方式构造代码,我会遇到问题吗?或者我应该采取一种更好、更健壮、更受欢迎的方法吗?您可以使用抽象服务来定义通用方法 这是一个很好的教程
我想说你走在正确的轨道上,但在单一责任原则上更进一步。这是一种行之有效的保持代码整洁的策略。我避免使用“助手”类。他们可能因为责任太多而变得一团糟。相反,我试图真正思考我的班级应该做什么。然后我给它起了一个很好的名字来提醒我它只做一件事
事实上,您的每个服务都有自己的数据库上下文,这可能是一个问题。只要确保在同一个Db上下文中调用多个依赖服务并传递给所有依赖服务。如果您的对象图很大,像AutoFac这样的容器将大有帮助。返回的数据是否相同?他们使用的是自己独特的数据库上下文还是相同的数据库上下文 一般来说,我建议避免创建助手类。通常,帮助器类用于操作对象,而不是执行数据库查询 根据你的评论,有两种方法可以实现这一点,一种比另一种容易 选项1: 如果您的应用程序真的是一个简单的应用程序,您不太关心以“正确”的方式进行操作,那么您可以简单地创建基本服务类并更新您的服务以扩展它,并将您的公共数据库访问移到基类中,如下所示:
abstract class BaseService
{
...
public ICollection<ExampleRecord> GetDatabaseRecords()
{
using (var context = new ApplicationDbContext())
{
/* Your DbContext code */
}
return databaseRecords;
}
...
}
这将完成工作,是您当前工作的更好选择,但通常不是最佳方法
选项2:
如果您的应用程序不仅仅是一个简单的应用程序,而且您担心代码的可维护性,那么我建议您考虑将数据库访问代码移动到一个单独的存储库类中,并使用诸如StructureMap之类的IoC容器通过依赖项注入将其注入到您的服务中
就我个人而言,我会推荐选项2,因为它更干净、更易于维护/扩展,而且您不会违反任何规则。这将如何实现?该链接未提及抽象服务或使用其类外函数的服务。创建一个基类(在本例中为EntityService)并在其中定义通用方法是的,所有服务的db上下文都是相同的;这是一个简单的应用程序。你的建议听起来很像纳乔·拉博德斯。很清楚,您是否建议我从包含公共函数的抽象基本服务类继承所有服务?
public class ExampleService : BaseService
{
...
public ICollection<ExampleRecord> GetRecords()
{
return this.GetDatabaseRecords();
}
...
}