新しいアプリケーション スイートで基本的な 3 層アーキテクチャを構築しようとしています。初めて、ベスト デザイン プラクティス (IoC/DI など) の適用を開始したいと考えています。
私の UI レイヤーは、作業を行うために BLL オブジェクトを作成する必要があります。
UI で BLL を 10 回呼び出す必要があるとします。BLL オブジェクトを 10 回作成する必要がありますか、それともフォームの読み込み時に 1 回作成する必要がありますか?
新しいアプリケーション スイートで基本的な 3 層アーキテクチャを構築しようとしています。初めて、ベスト デザイン プラクティス (IoC/DI など) の適用を開始したいと考えています。
私の UI レイヤーは、作業を行うために BLL オブジェクトを作成する必要があります。
UI で BLL を 10 回呼び出す必要があるとします。BLL オブジェクトを 10 回作成する必要がありますか、それともフォームの読み込み時に 1 回作成する必要がありますか?
通常、呼び出しごとにビジネス オブジェクトを再作成します。これは、HTTP ベースの Web サイトを作成する場合に必要な、ステートレス アプリケーションの維持に役立ちます。
非常に重いオブジェクトが原因でこれが問題になる場合は、オブジェクトのキャッシュ/プールを作成したり、Session オブジェクトに保存したりするなどの対策があります。やむを得ない場合を除き、そこには行かないでください。
私の UI レイヤーは、作業を行うために BLL オブジェクトを作成する必要があります。
推奨される方法は、ビジネス レイヤー オブジェクトのインターフェイスが、作成時または後でプロパティを介して GUI フォームに挿入される場合です。この場合、フォームはビジネス層オブジェクトについて何も知らず、それらのインスタンス化を気にせず、本来あるべきこと (GUI 対話) のみを行います。
個人的には、コンストラクター注入を好みます。
public class MyForm
{
private IDocumentStorage documentStorage;
private IJobsRegistrator jobsRegistrator;
public MyForm(IDocumentStorage documentStorage, IJobsRegistrator jobsRegistrator)
{
this.documentStorage = documentStorage;
this.jobsRegistrator = jobsRegistrator;
}
}
ビジネス層インターフェイスの場所IDocumentStorage
と場所。IJobsRegistrator
制限がある場合は、代わりにプロパティ セッターを使用できます (たとえば、パラメーターなしのコンストラクターのみを使用できます)。
厳密にはシンプルな3層
層 1 - データベース ここにはロジックはなく、RDBMS メカニズムによるデータの取得と保存のみ
層 2 - ビジネス ロジック/データ アクセス データ アクセス オブジェクト (層 1 との間でデータの受け渡し/取得、ビジネス オブジェクトはここで作成する必要があります) およびビジネス データ (ドメイン) オブジェクトはここから作成/入力/保存する必要があります
層 2 ユーザー インターフェイス ユーザーの作成/操作のために、データ (層 2 から取得したビジネス オブジェクト内) をユーザーに提示するだけです。
うーん...これに対する率直な答えを期待すると、がっかりします。答えは、場合によります。
オブジェクトがステートレスな軽量オブジェクトの場合 - 作業が楽になるのであれば、毎回作成してください。
一方、オブジェクトが状態を維持する必要がある場合、または作成に多くのリソースが必要な場合は、シングルトンの作成/管理に必要なすべてのオーバーヘッドを備えたシングルトンとして作成する必要があります。
どちらのシナリオも DI コンテナーでサポートされていますが、シナリオに適したものを選択するのはユーザー次第です。
オブジェクトがサービス タイプのクラスである場合、つまり、一部の入力を受け取り、一部の出力 (リポジトリ タイプ オブジェクトなど) を提供する場合、UI レイヤーがその抽象バージョンに依存するようにする必要があります。次に例を示します。
public class UILayerComponent
{
private readonly IBLLObject _bllobject;
public UILayerComponent(IBLLObject obj)
{
_bllobject = obj;
}
}
ただし、UI レイヤーは、このオブジェクトのインスタンス化、有効期間の管理、さらには具体的な実装について何も認識しない必要があります。これは、IoC コンテナーが処理するジョブである必要があります。
ただし、オブジェクトが状態駆動型の場合 (たとえば、あるユーザー アクションによって作成され、別のユーザー アクションによって更新または削除されるなど)、必要に応じてオブジェクトを作成および破棄する必要があります。