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

2024-01-18

最近我使用了 asp.net mvc,我在示例项目中看到正在使用数据库工厂类。您如何向我解释为什么使用它?

IDatabaseFactory类

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

数据库工厂类

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();
    }
}

这是一个例子抽象工厂 http://sourcemaking.com/design_patterns/abstract_factory设计模式。这个想法是创建一个接缝以在类之间提供松散耦合,以便可以交换另一种类型的上下文,无论是出于测试目的还是为了扩展应用程序。

一般来说,工厂是一种管理短期依赖关系的方法,例如数据库连接。通常,框架公开一种注入工厂实例的方法,然后框架可以基于接口(在本例中为 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 与替代实现(通常称为里氏替换原则 http://www.oodesign.com/liskov-s-substitution-principle.html):

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 应该是一个模拟(可以通过手动编码类或使用模拟框架来完成)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 ASP.NET MVC 中使用数据库工厂? 的相关文章

随机推荐

  • 错误服务休息 Spring Boot:java.util.NoSuchElementException:不存在值

    早上好 我在使用 Spring Boot 制作 REST Web 服务时遇到问题 应用程序向我运行 但是在呈现数据时 它向我显示好像该表不存在于数据库 ORACLE 中 我不知道它是否存在我在类的配置中遗漏了一些东西 我附上我得到的答案的延
  • 当我在 Visual Studio 中重建时(设计器视图),我的 userControl 中的更改被删除

    This is my navigationItem cs user control using System using System Collections Generic using System ComponentModel usin
  • SQL自动增量pgadmin 4

    我正在尝试使用数字生成器创建一个简单的数据库 但为什么会出现以下错误 错误 AUTO INCRMENT 处或附近的语法错误第 2 行 IDNumber int NOT NULL AUTO INCRMENT Code CREATE TABLE
  • 如何从 Innosetup 脚本修改 exe.config

    我已经开始自学Innosetup脚本了 为此 我创建了一个简单的 C 控制台应用程序 它从配置文件中读取元素并输出到控制台
  • 字段的算术运算

    是否可以查询两个字段相减的结果 例如 有两个字段 开始 结束 我想要带有以下内容的文件end start gt 10 这可以直接完成还是唯一的方法是在加载具有此差异的文档时创建一个新字段 您可以使用脚本过滤器 http www elasti
  • 如何获取 Hibernate 中返回的多种对象类型

    我正在使用 Hibernate JSF Spring3 在查询中 我需要获取作为结果返回的许多对象类型 public ArrayList
  • 无法在 Red hat linux 上安装 rgdal 和 rgeos R 库

    我编译时出错rgdal adn rgoes我们的 redhat linux 机器上的包 我尝试做一些研究 但找不到可能的解决方案 您能帮我解决这个问题吗 因为这对我来说非常重要 ERROR WHILE COMPILING RGDAL in
  • 仅变量应通过函数引用进行赋值

    我使用旧版本的 Codeigniter 框架 使用新版本的 php 我收到此错误 Only variables should be assigned by reference 我想知道这是否是安全的错误修复 改变 this gt base
  • ios 应用内订阅 - Original_transaction_id 何时更改?

    当存在自动续订订阅时 请考虑以下模型情况 用户购买 1 个月的订阅 假设在一月份 取消续订 然后等到三月 gt 1 个月 并再次购买相同的订阅 AppStore 是否返回 在收据验证时 新的original transaction id对于
  • iPhone 中的 Sqlite3 数据库被锁定 - 如何避免?

    我有一个在 Sqlite3 DB 上执行搜索的查询 它除了使用阅读器进行阅读之外什么也不做 对于每个找到的匹配项 它都会调用 UI 回调来更新结果视图 当此搜索运行时 我点击了 UI 中的一个按钮 该按钮将在新线程中执行一些其他操作 最后它
  • 溢出 y 隐藏 溢出 x 可见

    我有一个 div 蓝色框 它绝对定位在父元素 红色框 内的页面上 并且我需要将 Overflow y 设置为隐藏 以便强制截断 Y 轴上的溢出内容 但我希望任何溢出 x 的内容都可见 HTML div div div style width
  • 使用 hibernate 标准选择值对象

    我试图找出是否可以使用 Hibernate Criteria API 执行以下 HQL String hql select new InitialCount substring name 1 1 count id from Person g
  • 使用自定义身份验证提供程序/服务的 ASP.Net Identity

    我目前正在开发一个 ASP Net MVC Web 应用程序 需要用户名和密码身份验证 我开始考虑使用 ASP Net Identity 来实现此目的 但是我有一个非常重要的要求 要求是 Web 应用程序本身不能直接访问任何数据库 所有 D
  • Google 地图:如何移动缩放控件?

    如何通过 API 将 Google 地图缩放控件移动到地图的另一侧 var myOptions zoom 6 zoomControl true zoomControlOptions style google maps ZoomControl
  • Bootstrap 3:100%高度后如何粘贴

    我试图让我的导航栏在设置为 100 高度的介绍后固定到顶部 但我不确定执行此操作的最佳方法是什么 Code CSS html body height 100 min height 100 intro height 100 text alig
  • 如何监控第三方存储库的 GitHub 提交

    初学者在这里 我已为由其他人创建和管理的 GitHub 存储库加注星标 有没有办法监视提交并在每次有人签入主分支时向侦听器发送电子邮件 请注意 我不拥有该存储库 我只是想跟踪我喜欢的存储库上的更改 您可以获得原子饲料 https en wi
  • 如何解决此类问题?

    br br br div style line height 50 span style display block span div
  • Swift:如何查看 Xcode 监视窗口中显示的变量值?

    简单的问题 使用 Swift 时如何查看 Xcode 监视窗口中变量的值 这是一个示例 看看 mdn 如何具有值 2067134273 但无法在监视窗口中查看该值 ObjectiveC NSObject 不会扩展为任何内容 我认为这可能是由
  • Matplotlib 在绘图区域内移动刻度标签

    是否可以在绘图区域内放置刻度标签 我已经尝试过 ax tick params axis y pad 5 left off labelleft on and ax tick params axis y direction in left of
  • 为什么在 ASP.NET MVC 中使用数据库工厂?

    最近我使用了 asp net mvc 我在示例项目中看到正在使用数据库工厂类 您如何向我解释为什么使用它 IDatabaseFactory类 public interface IDatabaseFactory IDisposable EFM