2

我们正处于建立一个流量相当高的网站(每周大约 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 是否应该保留为默认值?

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

4

2 回答 2

3

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

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

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

于 2011-04-13T02:15:00.487 回答
1

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

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

你应该改变生活方式吗?如果您的应用程序足够快,我不应该打扰。如果速度不够快,您应该了解将服务转移到单身生活方式是否有任何影响。换句话说,遵循Rico Mariani 的 10 条绩效规则:衡量、衡量、衡量、衡量、衡量、衡量、衡量、衡量、衡量和衡量 :-)

于 2011-03-15T11:18:13.100 回答