我们正处于建立一个相当高流量的网站的最后阶段(每周大约有600万次页面印象),并且正在使用LinFu作为新架构中的IoC容器。
我们有一个相当标准的设置:
Web Layer
|
IServices <- Services Implementation
|
IDataRepository <- DataRepository Implementation
|
DataBase在web层中,我们有一个LinFu ServiceContainer实例(我们的实现中的一个实例),它提供页面所需的服务对象实例。DataRepository程序集中的每个类也是以相同的方式创建的(每个服务构造函数都接受它所需的DataRepository对象的接口)。
一个简单的例子是:
IWeatherServices
{
Weather GetForecast();
Weather GetPrediction();
}
[Implements(typeof(IWeatherServices))
WeatherServices(IWeatherForecastRepository, IWeatherPredictionRepository) : IWeatherServices
{
// implementation of methods
}(以及DataRepository类的类似功能)
目前,我们将生命周期类型保留为默认类型(我相信这是PerRequest)。
我的主要问题是:
我知道这有点开放,但我们正在进行负载测试期间的调优,所以我对总体观点非常感兴趣。
发布于 2011-03-15 11:18:13
拥有容器的一个实例(因此是一个单例)是非常常见的事情。但是,防止在整个应用程序中调用它。相反,使用构造函数注入,让容器只解析最上面的对象。从你的例子来看,我相信你已经这么做了。
短暂的生活方式(在每次调用容器时创建一个新实例)是最简单的事情,通常也是最安全的事情。由于多线程而产生的比赛条件的变化是最小的.另一方面,这是最糟糕的表演生活方式。
你应该改变生活方式吗?如果你的申请足够快,我就不用麻烦了。如果速度不够快,你应该找出将服务转移到独生子女生活方式是否有任何影响。换句话说,遵循里科·马里亚尼的10条规则以获得性能:度量值和度量:-)
发布于 2011-04-13 02:15:00
如果您没有使用LinFu的自动字段/属性/方法注入特性,可以尝试:
container.DisableAutoPropertyInjection();
container.DisableAutoMethodInjection();
container.DisableAutoFieldInjection();这将大大提高LinFu容器的性能,因为它不必经常检查字段、属性和自动注入的方法。
https://stackoverflow.com/questions/5310389
复制相似问题