2012-05-26 88 views
5

我目前正在开发一个C#MVC REST web api,并试图在我们设计的两种可能性中选择一种。C#静态方法vs对象实例

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

我想要决定的是用一个静态函数写一个静态类,或者编写一个工厂方法来创建这些类的实例,它们有一个实例方法,称为ExecuteQuery

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

直观地说,静态方法会更快,但我已经期待我会遇到一些头痛的问题,通过反射来调用它们(以支持热载代码要求)。

如果对短期对象没有巨大的惩罚,那么他们可能仅凭简单就赢得胜利。

我们期望的负载相关信息:在300ms以内

  • 响应时间 - 800毫秒范围
  • 约2000 Web客户端的约4000客户
  • 客户做查询
  • 高峰负荷平均负载每2 - 5秒
  • 客户端每秒查询1次峰值速率

此外,每个DataSource将创建最多8个,其中3个平均值为这些实例。

+0

可能你的意图使用反射将导致比静态与实例使用更大的性能影响。正如其他人所评论的那样,你应该选择使设计意义最大的形式。另外,由于你有一些预期的指标,你可以嘲笑一个静态/实例实现,并了解你将面临的开销。 –

回答

1

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

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

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

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

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

+0

我曾经在他们身上使用Singleton模式进行过辩论,但还没有做出任何决定。 我认为MEF就是我正在寻找的东西。谢谢! –

0

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

如果“否”,那么通过一切手段,使其成为一种静态方法。

恕我直言.. PSM

+0

不幸的是,对所有可能的对象的要求还没有完成,所以虽然我不认为它们会有状态,但在这个阶段我不能100%确定。 –

1

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

  • 既然你似乎没有一次有很多客户,所以这也是 将与单身模式。
  • 并发查询并不多(主要是因为上述语句)。
  • 您有一个已定义的响应时间规范。

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

1

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

+0

这是一个非常好的观点,我没有想到,MVC必须在每个请求的基础上制作多个对象。我肯定会研究MEF,因为它现在已经提到了两次,而且匆匆一瞥,它看起来正是我想要的。 –