2

私たちは非常にトラフィックの多いウェブサイト(週に約600万ページのインプレッション)をまとめる最終段階にあり、新しいアーキテクチャ内のIoCコンテナとしてLinFuを使用しています。

かなり標準的な設定があります。

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

Webレイヤーには、ページで必要とされるServicesオブジェクトのインスタンスを提供するLinFu ServiceContainer(実装ではシングルトン)のインスタンスがあります。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

コンテナのインスタンスを1つ(つまりシングルトン)持つことは、非常に一般的なことです。ただし、アプリケーション全体で呼び出されないようにしてください。代わりに、コンストラクタインジェクションを使用して、コンテナが最上位のオブジェクトのみを解決するようにします。あなたの例を見ると、あなたはすでにこれを行っていると思います。

一時的なライフスタイル(コンテナへの呼び出しごとに新しいインスタンスを作成する)は最も単純なことであり、多くの場合、最も安全な方法です。マルチスレッドによる競合状態の変化は最小限です。一方で、それは最もパフォーマンスの悪いライフスタイルです。

あなたはライフスタイルを変えるべきですか?あなたのアプリケーションが十分に速いなら、私は気にしないでください。また、速度が十分でない場合は、サービスをシングルトンライフスタイルに移行することが効果があるかどうかを確認する必要があります。言い換えれば、パフォーマンスに関するRico Marianiの10のルールに従ってください:測定、測定、測定、測定、測定、測定、測定、測定、測定、および測定:-)

于 2011-03-15T11:18:13.100 に答える