C#静态方法与对象实例

时间:2012-05-26 01:27:37

标签: c# model-view-controller static-methods factories

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

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

我正在尝试解决的问题是使用单个静态ExecuteQuery函数编写静态类,或者编写工厂方法来创建这些类的实例,这些类具有名为ExecuteQuery的实例方法

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

直观地说,静态方法会更快,但是我已经预料到通过反射调用它们会遇到一些麻烦(为了支持热负载的代码要求)。

如果对短命物品没有巨大的惩罚,那么他们可能会凭借简单性赢得胜利。

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

  • 300毫秒 - 800毫秒范围内的响应时间
  • 约2000个Web客户端的平均负载
  • 约4000个客户的高峰负荷
  • 客户每2至5秒进行一次查询
  • 每秒1个查询的客户端峰值率

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

4 个答案:

答案 0 :(得分:1)

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

  • 由于您似乎没有同时拥有多个客户端,所以这也是如此 将使用Singleton模式。
  • 没有多少并发查询(主要是因为上述声明)。
  • 您有一个已定义的响应时间规范。

我可以为Factory模式做的唯一参数是“简单”。如果项目真的对时间敏感,那么我想你别无选择。但如果你真的想要表现,请选择Singleton。

答案 1 :(得分:1)

使用MEF。无需创建自己的插件框架。它将引导您通过接口暴露的实例方法。创建每个请求对象并不罕见...... MVC框架在所有地方都可以实现。每个请求实例对于数据访问方案来说是一件特别好的事情,因此您可以以一种用户体验不会影响其他用户的方式支持事务/回滚之类的事情,直到您明确地实现它为止。如果perf是个问题,请在适当的地方使用响应缓存。

答案 2 :(得分:1)

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

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

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

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

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

答案 3 :(得分:0)

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

如果“否”,则无论如何都要使其成为静态方法。

恕我直言.. PSM