5

我目前正在开发一个 C# MVC REST web api,并试图在我们的设计的两种可能性之一之间进行选择。

在不深入了解我们的设计的情况下,我们打算创建一个用于数据访问的类,我们将其称为DataSource. 每个DataSource人都需要执行小的、包含的逻辑块来正确构建适当的响应。由于希望将来能够热加载代码,我们不想简单地将这些功能放在 上DataSource,而是希望它们由其他程序集提供。我们已经实现了这个概念的证明,到目前为止,一切都很好。

我试图在两者之间做出决定是编写一个带有单个静态ExecuteQuery函数的静态类,还是编写一个工厂方法来创建这些类的实例,这些实例有一个名为ExecuteQuery.

每个请求创建多个短期对象与调用静态方法之间的性能考虑是什么?

直观地说,静态方法会更快,但我已经预料到通过反射调用它们会有点头疼(以支持热加载的代码要求)。

如果对短寿命的物体没有巨大的惩罚,那么它们可能仅靠简单性就胜出。

有关我们预期负载的相关信息:

  • 响应时间在 300ms - 800ms 范围内
  • 大约 2000 个 Web 客户端的平均负载
  • 约 4000 个客户端的峰值负载
  • 客户端每 2 - 5 秒查询一次
  • 每秒 1 次查询的客户端峰值速率

此外,每个DataSource实例最多创建 8 个,平均为 3 个。

4

4 回答 4

1

我假设每个DataSource实例都会与数据库建立新连接。如果是这样,那么只有一个实例是有意义的。找出“这是否是一个巨大的惩罚”的唯一方法是创建一个解决方案和配置文件的模型,看看影响是否显着。

  • 由于您似乎一次没有很多客户,所以这也适用于单例模式。
  • 并发查询不多(主要是因为上面的语句)。
  • 您有一个已定义的响应时间规范。

我可以为工厂模式提出的唯一论点是“简单”。如果该项目确实对时间敏感,那么我想您别无选择。但是,如果您真的想要性能,请选择 Singleton。

于 2012-05-26T01:40:06.440 回答
1

使用 MEF。无需发明自己的插件框架。它将引导您使用通过接口公开的实例方法。创建每个请求的对象并不少见...... MVC 框架在所有地方都可以做到这一点。每个请求的实例对于数据访问场景来说是一件特别好的事情,这样您就可以支持事务/回滚之类的事情,其中​​一个用户的体验不会影响其他用户,直到您明确地做出它。如果性能有问题,请在适当的地方使用响应缓存。

于 2012-05-26T01:40:17.347 回答
1

使用静态类,将调用委托给实现类。

这些实现类应该实现一个通用接口,这将允许您在不需要反射的情况下调用它们的方法。当然,静态方法不能实现接口方法。接口实现必须是实例,您需要某种工厂来实例化它们。如果它们存在于外部程序集中,我强烈建议您查看托管可扩展性框架 (MEF),请参阅http://msdn.microsoft.com/en-us/library/dd460648.aspx

每个请求创建多个短期对象与调用静态方法之间的性能考虑是什么?鉴于这些方法将进行数据访问,性能影响完全可以忽略不计。

如果您使用 MEF,框架将为您创建类似单例的实例。

如果您扮演自己的角色,并且想要消除多次创建这些对象的需要,您可以在它们上实现单例模式。

于 2012-05-26T01:51:21.847 回答
0

主要决定应该是“这个对象有状态吗?”

如果“否”,那么请务必将其设为静态方法。

恕我直言.. PSM

于 2012-05-26T01:35:34.293 回答