gpt4 book ai didi

c# - 静态存储库 - 解决方法

转载 作者:太空狗 更新时间:2023-10-30 00:54:59 26 4
gpt4 key购买 nike

首先,一些背景。我们最近接手了一个大型 MVC3 项目。该项目几乎已经准备好在一段时间前上线,然后客户决定他们想要重新设置整个网站的主题并添加更多功能。他们雇用我们重新设计网站主题,完成剩余功能并进行部署。

通常它是使用一种非常清晰、有序的方法构建的,每个数据库表都有一个存储库和一个清晰的服务层,但是有一些奇怪的地方让我有点不舒服。一直困扰我的主要怪事是应用程序中的每个存储库和服务都是完全的,100% 静态的(是的,包括写入数据库的方法)。当然,这不允许进行单元测试,但更令人担忧的是当应用程序承受重负载时会导致的潜在瓶颈和线程问题。我已经看到在阶段服务器上处理请求时出现一些无法解释的延迟,这与少量测试流量有关。

该应用程序非常庞大,以至于重建它以使用 IOC/instantiated-per-request 存储库几乎是不可能的。

如何避免在部署时出现潜在的线程问题?每次需要写入时,我可以使用连接池并借用数据库连接吗?

提前致谢:)

编辑 - 这是创建实体模型实例的一些代码。每个静态方法都调用此“DemoEntities”方法来获取实体模型的实例,然后使用该实例来执行 db 命令。我可以在这里看到,虽然该方法是静态的,但它实际上是在检查 HttpRequest 中是否存在一个预先存在的实例,如果它不存在则创建一个。因此,我认为我们会没事的。

   public static DemoEntities DemoEntities
{
get
{
if (HttpContext.Current != null && HttpContext.Current.Items["DemoEntities"] == null)
{
HttpContext.Current.Items["DemoEntities"] = new DemoEntities();
}
return HttpContext.Current.Items["DemoEntities"] as DemoEntities;
}
set
{
if (HttpContext.Current != null)
HttpContext.Current.Items["DemoEntities"] = value;
}
}

`

帕特

最佳答案

我在这里假设您的存储库类只包含静态方法,而不包含任何静态。

无状态静态类的好处是它们可以安全地转换为具有默认无参数构造函数的常规类,并且无需担心它们的生命周期。然后提取用于测试目的的接口(interface)将是一个简单的案例。

每当您需要与存储库对话时,只需实例化一个即可。

除非应用程序在存储库使用期间使用共享状态执行某些操作,否则您无需担心多线程访问。数据库本身负责处理许多并发调用。

目前所有瓶颈和线程问题都是潜在的,有时我们对可能出错的有根据的猜测本身是错误的 - 尤其是多线程。速度变慢可能仅仅是因为数据库没有能力处理太多请求。

关于c# - 静态存储库 - 解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10916861/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com