1

Web アプリケーションの使用中に、すべてのサービスとリポジトリが呼び出されることを知っています。Web アプリケーションの起動時に一度インスタンス化し、インスタンス化された参照をコードで参照したいと考えています。

サービス/リポジトリを静的またはシングルトンにせずに、Web アプリケーションの有効期間中に 1 回だけインスタンス化するための一般的なパターンはありますか?

サービス/リポジトリをテスト容易性のために静的クラスまたはシングルトンにすることは避けたいのですが、ステートレスになるように設計されている場合、すべての Web リクエストでそれらをインスタンス化するのは適切ではないようで、アプリケーションの存続期間中にそれらがすべて必要になることがわかっています。

c#/asp.net を使用しています。

4

2 に答える 2

1

必要な概念は IoC/DI と呼ばれ、これには多くのフレームワークがあります。CustomerService のようなクラスがあり、定義上依存関係である CustomerRepository が必要な場合、CustomerService のコンストラクターを介して渡す必要がありますが、どこで CustomerService をインスタンス化するかという問題があります。まあ、誰がそのサービスを使用するかは、コンストラクターを介して取得する必要があります。それはおそらく、CustomerPresenter やその他のクラスであり、無関係です。私のポイントは、依存性注入を行うことで、IoC / DI フレームワークがルールに従ってそれらの依存性を解決する非常に単一のポイントにコードを構造化するということです。

プログラムの一番上に、次のようなものがあります。

ICustomerPresenter presenter = IoC.Resolve<ICustomerPresenter>();

すべてが舞台裏で自動的にまとめられます。

これを実現するために、StructureMap を使用した例を次に示します。

For<ICustomerPresenter>().Use<CustomerPresenter>();
For<ICustomerService>().Singleton().Use<CustomerService();
For<ICustomerRepository>().Singleton().Use<CustomerRepository>();

これにより、テスト容易性を維持できます。ここではかなり単純化したので、そのままではあまり使用できませんが、オンラインで IoC / DI のリソースがたくさんあるので、チェックしてみてください。

注: Web アプリケーションの場合、リクエストごとの処理ライフサイクルを確認する必要があります。Web アプリケーション全体でシングルトンを使用することはめったにありません。

于 2011-07-09T07:42:06.067 に答える
0

依存性注入フレームワークは、オブジェクトの有効期間を処理します。

例えば

container.RegisterType<MyService>().Singleton();

多くの DI フレームワークがあり、最適なものを選択できます。

于 2011-07-09T03:47:45.507 に答える