为什么要在ASP.NET MVC中使用数据库工厂?

阮钦(Khiem Nguyen)

最近,我使用过asp.net mvc,在示例项目中看到的是使用Database Factory类。您如何为我解释为什么使用它?

IDatabaseFactory类

public interface IDatabaseFactory : IDisposable
{
    EFMVCDataContex Get();
}

DatabaseFactory类

public class DatabaseFactory : Disposable, IDatabaseFactory
{
    private EFMVCDataContex dataContext;
    public EFMVCDataContex Get()
    {
        return dataContext ?? (dataContext = new EFMVCDataContex());
    }
    protected override void DisposeCore()
    {
        if (dataContext != null)
            dataContext.Dispose();
    }
}
夜猫子888

这是一个抽象工厂设计模式的示例想法是创建一个接缝,以在类之间提供松散的耦合,以便可以出于测试目的或扩展应用程序而交换另一种类型的上下文。

一般而言,工厂是一种管理短期依赖项(例如数据库连接)的方法。通常,框架公开一种注入工厂实例的方法,然后该框架可以基于接口(在本例中为IDatabaseFactory)作为框架与框架用户之间的契约来使用它。该框架将具有类似于以下内容的代码:

public interface ISomeService
{
    void DoSomething();
}

public class SomeService()
{
    private readonly IDatabaseFactory factory;

    // The factory is injected through the constructor
    public SomeService(IDatabaseFactory factory)
    {
        this.factory = factory;
    }

    public void DoSomething()
    {
        using (EFMVCDataContex context = this.factory.Get())
        {
            // Run a LINQ query here using the context

        } // This bracket disposes the context
    }
}

与工厂创建的上下文相比,服务实例化的寿命更长。更重要的是,在这种情况下,上下文始终可以正确处理。

现在,这样做的主要好处是您可以将DatabaseFactory与替代实现(通常称为Liskov替代原理交换

public class MyDatabaseFactory : Disposable, IDatabaseFactory
{
    private EFMVCDataContex dataContext;
    public EFMVCDataContex Get()
    {
        return dataContext ?? (dataContext = new AlternateDataContext());
    }

    protected override void DisposeCore()
    {
        if (dataContext != null)
            dataContext.Dispose();
    }
}

假设AlternateDataContext继承(或实现)EFFMCDataContex,则可以将MyDatabaseFactory与DatabaseFactory进行苹果换苹果,而无需对SomeService进行任何更改。

可以在构造函数中使用连接字符串对MyDatabaseFactory进行编码,例如,为您提供了一种连接备用数据库的方法。

当然,这样做的另一个很大好处是创建了IDatabaseFactory的模拟实现,该实现可用于测试DoSomething方法。在单元测试中,SomeService(被测类)应该是唯一使用的真实类,IDatabaseFactory应该是模拟类(可以通过手动编码类或使用模拟框架来完成)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么要在ASP.NET MVC中使用数据库工厂?

来自分类Dev

为什么要在asp.net中使用ClientTarget =“ uplevel”?

来自分类Dev

在ASP.NET MVC 5中使用视图模型或数据库模型

来自分类Dev

如何在asp.net mvc中使用Linq从数据库中删除多个记录

来自分类Dev

如何在 ASP.NET MVC 中使用 JSON 为数据库做种

来自分类Dev

首先在ASP.Net MVC EF6数据库中使用VB.Net

来自分类Dev

使用ASP.NET MVC更新数据库

来自分类Dev

为什么要在ASP.Net应用程序中使用IoC容器(Autofac,Ninject,Unity等)进行依赖项注入?

来自分类Dev

如何在ASP.NET MVC 4中使用ViewModel(IEnumerable)更新我的数据库

来自分类Dev

如何在数据库中存储图像URL并在ASP.NET MVC中使用它?

来自分类Dev

为什么我们需要在ASP.NET MVC中调用父类的空虚方法

来自分类Dev

为什么要在asp.net按钮中调用__doPostback?

来自分类Dev

在 Asp.net C# 中使用 jQuery Ajax 插入数据 [数据库 MySQL]

来自分类Dev

ASP.NET:为什么要避免在工厂中使用GetService?

来自分类Dev

如何使用ASP.NET MVC将数据从数据库导出到Excel工作表?

来自分类Dev

ASP.NET MVC使用数据库表跨多个向导步骤持久保存数据

来自分类Dev

使用重命名的数据库表进行 ASP.NET MVC Code First 数据迁移

来自分类Dev

如何使用asp.net mvc检查数据库中是否存在重复数据

来自分类Dev

ASP Net MVC Oracle数据库无法检索数据

来自分类Dev

如何使用ASP.NET MVC将使用GrapeJS汇编的页面保存到数据库

来自分类Dev

如何在ASP.NET MVC中使用邮政将电子邮件发送到数据库中的多个电子邮件地址

来自分类Dev

当您要在Asp.net MVC中创建自定义主体时,为什么要创建自定义主体接口?

来自分类Dev

如何在旧数据库中使用asp.net Identity 2.0

来自分类Dev

如何在asp.net中使用jquery与数据库连接

来自分类Dev

如何在ASP.NET Identity(WebForms)中使用我自己的数据库

来自分类Dev

如何在没有实体框架的ASP.NET中使用Oracle数据库?

来自分类Dev

如何在asp.net中使用jquery与数据库连接

来自分类Dev

如何在旧数据库中使用asp.net Identity 2.0

来自分类Dev

使用ASP.NET MVC 4 + Entity Framework将图像保存到数据库

Related 相关文章

  1. 1

    为什么要在ASP.NET MVC中使用数据库工厂?

  2. 2

    为什么要在asp.net中使用ClientTarget =“ uplevel”?

  3. 3

    在ASP.NET MVC 5中使用视图模型或数据库模型

  4. 4

    如何在asp.net mvc中使用Linq从数据库中删除多个记录

  5. 5

    如何在 ASP.NET MVC 中使用 JSON 为数据库做种

  6. 6

    首先在ASP.Net MVC EF6数据库中使用VB.Net

  7. 7

    使用ASP.NET MVC更新数据库

  8. 8

    为什么要在ASP.Net应用程序中使用IoC容器(Autofac,Ninject,Unity等)进行依赖项注入?

  9. 9

    如何在ASP.NET MVC 4中使用ViewModel(IEnumerable)更新我的数据库

  10. 10

    如何在数据库中存储图像URL并在ASP.NET MVC中使用它?

  11. 11

    为什么我们需要在ASP.NET MVC中调用父类的空虚方法

  12. 12

    为什么要在asp.net按钮中调用__doPostback?

  13. 13

    在 Asp.net C# 中使用 jQuery Ajax 插入数据 [数据库 MySQL]

  14. 14

    ASP.NET:为什么要避免在工厂中使用GetService?

  15. 15

    如何使用ASP.NET MVC将数据从数据库导出到Excel工作表?

  16. 16

    ASP.NET MVC使用数据库表跨多个向导步骤持久保存数据

  17. 17

    使用重命名的数据库表进行 ASP.NET MVC Code First 数据迁移

  18. 18

    如何使用asp.net mvc检查数据库中是否存在重复数据

  19. 19

    ASP Net MVC Oracle数据库无法检索数据

  20. 20

    如何使用ASP.NET MVC将使用GrapeJS汇编的页面保存到数据库

  21. 21

    如何在ASP.NET MVC中使用邮政将电子邮件发送到数据库中的多个电子邮件地址

  22. 22

    当您要在Asp.net MVC中创建自定义主体时,为什么要创建自定义主体接口?

  23. 23

    如何在旧数据库中使用asp.net Identity 2.0

  24. 24

    如何在asp.net中使用jquery与数据库连接

  25. 25

    如何在ASP.NET Identity(WebForms)中使用我自己的数据库

  26. 26

    如何在没有实体框架的ASP.NET中使用Oracle数据库?

  27. 27

    如何在asp.net中使用jquery与数据库连接

  28. 28

    如何在旧数据库中使用asp.net Identity 2.0

  29. 29

    使用ASP.NET MVC 4 + Entity Framework将图像保存到数据库

热门标签

归档