我们正处于建立一个流量非常高的网站(每周大约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)。
我的主要问题是:
我知道这有点开放,但我们正处于负载测试期间的调优过程中,因此对一般意见非常感兴趣。
答案 0 :(得分:3)
如果您没有使用LinFu的自动字段/属性/方法注入功能,您可以尝试:
container.DisableAutoPropertyInjection();
container.DisableAutoMethodInjection();
container.DisableAutoFieldInjection();
这应该会给LinFu容器带来显着的性能提升,因为它不必经常检查您的字段,属性和自动注入方法。
答案 1 :(得分:1)
拥有一个容器实例(因此是一个单例)是很常见的事情。但是,要防止在整个应用程序中调用它。相反,使用构造函数注入,让容器只解析最顶层的对象。从你的例子来看,我相信你已经这样做了。
瞬态生活方式(在每次调用容器时创建一个新实例)是最简单的事情,通常是最安全的事情。由于多线程而具有竞争条件的变化是最小的。另一方面,这是表现最差的生活方式。
你应该改变生活方式吗?如果您的应用程序足够快,我不应该打扰。如果速度不够快,您应该了解移动服务对单身生活方式是否有任何影响。换句话说,请按Rico Mariani's 10 rules了解绩效:衡量,衡量,衡量,衡量,衡量,衡量,衡量,衡量,衡量和衡量: - )