LinFu IoC高流量网站的最佳实践

时间:2011-03-15 10:29:59

标签: performance inversion-of-control linfu

我们正处于建立一个流量非常高的网站(每周大约600万次网页展示次数)的最后阶段,并且正在使用LinFu作为新架构中的IoC容器。

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

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

在Web层中,我们有一个LinFu ServiceContainer实例(在我们的实现中是一个单例),它提供了页面所需的Services对象的实例。 DataRepository程序集中的每个类也以相同的方式创建(每个Services构造函数都接受它所需的DataRepository对象的接口)。

一个简单的例子是:

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

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

(和DataRepository类的类似功能)

我们暂时将生命周期类型保留为默认值(我相信这是PerRequest)。

我的主要问题是:

  • 我们应该将ServiceContainer作为Web应用程序中的单例吗?
  • 是否应将实现类上的LifecycleType保留为默认值?

我知道这有点开放,但我们正处于负载测试期间的调优过程中,因此对一般意见非常感兴趣。

2 个答案:

答案 0 :(得分:3)

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

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

这应该会给LinFu容器带来显着的性能提升,因为它不必经常检查您的字段,属性和自动注入方法。

答案 1 :(得分:1)

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

瞬态生活方式(在每次调用容器时创建一个新实例)是最简单的事情,通常是最安全的事情。由于多线程而具有竞争条件的变化是最小的。另一方面,这是表现最差的生活方式。

你应该改变生活方式吗?如果您的应用程序足够快,我不应该打扰。如果速度不够快,您应该了解移动服务对单身生活方式是否有任何影响。换句话说,请按Rico Mariani's 10 rules了解绩效:衡量,衡量,衡量,衡量,衡量,衡量,衡量,衡量,衡量和衡量: - )