Customer エンティティと Order エンティティがあります。流暢な休止状態を使用して顧客のクラスを定義するときに、注文リスト プロパティに「保護されたセット」を指定する必要があるのはなぜですか。
public virtual IList<Order> Orders { get; protected set; }
Customer エンティティと Order エンティティがあります。流暢な休止状態を使用して顧客のクラスを定義するときに、注文リスト プロパティに「保護されたセット」を指定する必要があるのはなぜですか。
public virtual IList<Order> Orders { get; protected set; }
protected
on setterを指定する必要はありません。そうするのはちょうど良い設計です。
セッターでアクセス修飾子が指定されていない場合、プロパティ自体と同じアクセス修飾子が暗黙的に設定されpublic
ます(この場合)。setter が public の場合、クラスのコンシューマはOrders
プロパティを変更して別のインスタンスに設定できます。
public class Customer
{
public virtual IList<Order> Orders { get; set; }
}
var customer = new Customer();
customer.Orders = new List<Order>();
setter でアクセス修飾子を定義するprotected
と、継承されたクラスのみがプロパティを変更できます。他のコンシューマには、Orders
プロパティは読み取り専用として表示されます。これは実質的にカプセル化です。
NHibernate はデフォルトで遅延読み込みを使用します。これは、一部のプロパティ (通常はリスト) がすぐに読み込まれるのではなく、最初の使用時に読み込まれる手法です。NHibernate はこれをプロキシで実装します。動的に作成されるプロキシ クラスは、Entity
クラスから継承し、そのすべてのプロパティをオーバーライドします。virtual
それが、すべてのクラス メンバーにある理由です。
要するに、定義するprotected set
と、NHibernate の動的プロキシがプロパティを変更できるようになりOrders
ます。Orders
空のプロキシ コレクションに初期化される可能性があり、誰かがそれを読み込もうとすると、データベースのロードがトリガーされ、Orders
プロパティがデータベースからロードされた Order インスタンスのリストに置き換えられます。
public class Customer
{
public virtual IList<Order> Orders { get; protected set; }
}
var customer = new Customer();
//customer.Orders = new List<Order>(); // error: can't modify property
var orderCount = customer.Orders.Count; // this will trigger lazy-loading