为什么在 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 中使用数据库工厂? 的相关文章

  • 卸载 SSL 时保护表单身份验证 Cookie

    我正在尝试使用 ASP NET MVC 2 0 和表单身份验证来保护我当前正在开发的网站 为了保护表单身份验证cookie 我想将requiresSSL 属性设置为true 以便浏览器仅在连接处于SSL 下时才发送cookie 并且显然确保
  • HttpContext 中需要什么才能允许 FormsAuthentication.SignOut() 执行?

    我正在尝试为我们的注销方法编写一个单元测试 除其他外 它FormsAuthentication SignOut 然而 它抛出一个System NullReferenceException 我创建了一个模拟 HttpContext 使用起订量
  • EF4 和 SQL Server 2000

    我使用 EF4 和 SQL Server 2005 开发了我的网站 但当转移到临时站点时 发现他们使用 SQL Server 2000 现在我收到此错误 我认为该错误与 SQL Server 2000 有关 Incorrect syntax
  • Web 文本编辑器中的 RTF 格式

    网络上是否有支持 RTF 格式文档输入的文本编辑器 我知道这对 webdev 来说有点奇怪 但我需要从数据库中读取 RTF 文档 并在基于 Web 的文本编辑器中对其进行编辑 然后将其存储回 RTF 中 在我在转换工具上投入太多资金之前 我
  • 多行有多个提交按钮,我应该为每个按钮制作一个表单吗?

    我列出了大约 20 行 每行代表一个订单 每行需要有 3 个按钮 每个按钮单击将执行不同的操作 我有 3 个操作来处 理每个按钮发布请求 我只是不确定如何为每个按钮设置 Html 表单 tr td td tr
  • IEnumerable 流式传输

    我想做一些大致相当于下面的代码示例的事情 我想生成并提供数据流 而不必在任何时候将整个数据集都存储在内存中 看来我需要一些接受 Stream 的实现IEnumerable
  • 为什么这个 Web api 控制器不并发?

    我有一个 Web API 控制器 里面有以下方法 public string Tester Thread Sleep 2000 return OK 当我调用它 10 次 使用 Fiddler 时 我预计所有 10 次调用都会在大约 2 秒后
  • 返回视图作为 JSON 对象的一部分

    我有一个应用程序只加载一次完整视图 我这样做的原因并不重要 重要的是 其余内容只会以部分视图的形式返回 除了一些内容之外 我还有一些 JSON 对象 我想通过每个 AJAX 请求在服务器之间来回传递 有没有办法返回一个 JSON 对象 并将
  • MVC Html.Partial 或 Html.Action

    我是 ASP NET MVC 新手 所以请耐心等待 我需要构建一个在多个视图中重复的菜单 什么可以更好地服务于目的Html Action http msdn microsoft com en us library ee703423 aspx
  • SQL Server中主键和唯一索引的区别[重复]

    这个问题在这里已经有答案了 我的公司目前正在重写我们最近获得的一个应用程序 我们选择使用 ASP net mvc4 来构建这个系统 并使用实体框架作为我们的 ORM 我们收购的公司的前任所有者非常坚定地要求我们使用他们的旧数据库 并且不对其
  • 我可以将 JSON 字符串转换为 JsonResult 吗?

    我在数据库中存储了一些存储的 JSON 字符串 我想将其作为 JsonResult 返回给客户端 我知道 Json object 将对象转换为 JsonResult 但如果我已经将结果存储在字符串中怎么办 我可以将其转换为 JsonResu
  • mvc 4下拉默认值选择

    我想在下拉列表中选择默认值 其中policyId 7 但它没有选择该值 我做错了什么 控制器 var pm new ManagerClass IEnumerable
  • 如何使用 EF Code First 解释枚举类型

    这是一个模型 Public class Person Key Public int PersonId get set Public int Age get set Public ColorEnum FavoriteColor get set
  • .Net MVC 4 项目失败,并出现事件日志错误“模块 DLL C:\WINDOWS\system32\inetsrv\aspnetcore.dll 无法加载。数据是错误。”

    这不是 DotNetCore 项目 它是 MVC 4 项目 并且应用程序池已正确配置为使用 dotnet CLR v4 但在更新到新版本的 Windows 10 后 无论是内部版本还是新的周年更新 启动应用程序失败 事件日志显示以下错误 模
  • MVC3数据缓存技术

    我有一个 sql 查询 存储过程 在结果显示在网络网格中之前需要大约 8 10 秒才能返回 关于 asp net mvc3 中的缓存的性能最佳实践是什么 以便用户不必每次都花费 8 10 秒来加载该数据 减少优化查询 你可以使用内存缓存 h
  • ASP.NET MVC2:“System.MissingMethodException:没有为此对象定义无参数构造函数。”

    我目前正在尝试修改默认 MVC 项目的注册组件 以适应我的项目 为此 我修改了 RegisterModel Register aspx 和 AccountController 我可以很好地查看寄存器视图 但是当我提交时 我在标题中收到错误
  • 保护 ASP.NET MVC 应用程序中的 ajax 调用的安全

    我有一个基于 ASP NET MVC 的应用程序 它允许根据用户进行不同级别的访问 当前的工作方式是 当用户访问页面时 会根据数据库进行检查以确定用户拥有的权限 然后根据用户拥有的访问级别选择视图 有些用户比其他用户看到更多数据并拥有更多可
  • 数据映射器和存储库之间到底有什么区别?

    嗯 我一直在试图找出数据映射器和存储库之间的区别 但到目前为止我仍然没有 在我看来 专家程序员说 存储库是映射层上的另一个抽象层 其中集中了查询构造代码 看似可以理解 但还是有些抽象 我之前在 stackoverflow 上读过这篇文章 这
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 如何在单击按钮时重新绑定 igGrid igniteUI 控件中的数据?

    我在 ASP NET MVC3 应用程序中使用 Infragistics Ignite UI 控件 我有一个已绑定到 客户 数据的网格 工作正常 现在我有按钮了 单击后我会进行 ajax 调用 在控制器中 我编写了仅选择 客户 数据的一部分

随机推荐

  • 错误服务休息 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