繁体   English   中英

C#静态方法与对象实例

[英]C# Static Method vs Object Instance

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

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

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

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

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

如果对短命物体没有巨大的惩罚,那么他们可能会单凭简单性而获胜。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

恕我直言.. PSM

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM