Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 跨多个服务访问公共功能_C#_Asp.net_Asp.net Mvc_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# 跨多个服务访问公共功能

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作为参数之一,这样这些函数就可以执行数据库查询以及逻辑并返回结果 这是个好主意吗?

我目前正在构建一个应用程序,目前我为每个控制器提供一个服务(该服务处理控制器的业务逻辑)。每个服务都有自己的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();
    }

    ...
}