2011-03-15 79 views
2

我们正在组建一个相当高流量的网站(每周约600万个网页印象)的最后阶段,并且正在使用LinFu作为新体系结构中的IoC容器。LinFu IoC在高流量网站上的最佳实践

我们有一个非常标准的设置:

Web Layer 
| 
IServices <- Services Implementation 
| 
IDataRepository <- DataRepository Implementation 
| 
DataBase 

在网络层,我们有一个提供对象所要求的网页服务的情况下,李林甫的ServiceContainer的一个实例(在我们的实施单)。 DataRepository程序集中的每个类也以相同的方式创建(每个Services构造函数接受它所需的DataRepository对象的接口)。

一个简单的例子是:

IWeatherServices 
{ 
    Weather GetForecast(); 
    Weather GetPrediction(); 
} 

[Implements(typeof(IWeatherServices)) 
WeatherServices(IWeatherForecastRepository, IWeatherPredictionRepository) : IWeatherServices 
{ 
    // implementation of methods 
} 

(又一次类似功能的DataRepository类)

我们已经离开了生命周期类型此刻的默认(我相信这是PerRequest )。

我的主要问题是:

  • 我们应该保持的ServiceContainer作为Web应用程序内的单?
  • 应该将实现类的LifecycleType保留为默认值吗?

我知道这是一个有点开放式的,但我们正在负载测试期间进行调整,所以我非常感兴趣的一般意见。

回答

1

具有容器(因此单)的一个实例是做一个很平常的事。但是,防止在整个应用程序中调用它。相反,使用构造函数注入并让容器只解析最顶层的对象。从看你的例子,我相信你已经在做这个。

瞬态生活方式(建立在每次调用容器新的实例)是最简单的东西,往往最安全的做法。由于多线程而导致的竞争条件变化很小。另一方面,这是表现最差的生活方式。

你应该改变生活方式吗?如果你的应用程序足够快,我不应该打扰。如果速度不够快,您应该了解将服务转移到单身生活方式是否有效。换句话说,按照Rico Mariani's 10 rules的性能:测量,测量,测量,测量,测量,测量,测量,测量,测量和测量:-)

+0

感谢您的回复。我们现在正在测试配置的变化,但知道我们没有做任何根本错误的事情是非常令人放心的。干杯! – 2011-03-15 12:14:45

+0

这个问题为什么低估? downvoter是否想解释为什么? – Steven 2011-07-02 17:19:35

3

如果您未使用LinFu的自动字段/属性/方法注入功能,你可以尝试:

container.DisableAutoPropertyInjection(); 
container.DisableAutoMethodInjection(); 
container.DisableAutoFieldInjection(); 

这应该给了李林甫容器显著的性能提升,因为它不会不断地检查你的字段,属性和方法,用于自动注射。

+0

太好了,谢谢你的提示!该网站昨天开始运行,除了一台服务器上的一些奇怪的错误外,它似乎表现良好,但我认为我们可以深入了解这一点。 – 2011-04-13 10:47:31

+0

很酷。如果您需要其他任何东西,请在marttub(at sign)hotmail(dotcom)上ping我。 – plaureano 2011-04-14 05:37:58