고객 및 주문 엔티티가 있습니다. 유창한 최대 절전 모드를 사용하여 고객을위한 클래스를 정의하는 동안 주문 목록 속성에 "보호 된 집합"을 지정해야하는 이유는 무엇입니까?일대 다 관계 특성에 대한 보호 집합이 설정된 이유
public virtual IList<Order> Orders { get; protected set; }
고객 및 주문 엔티티가 있습니다. 유창한 최대 절전 모드를 사용하여 고객을위한 클래스를 정의하는 동안 주문 목록 속성에 "보호 된 집합"을 지정해야하는 이유는 무엇입니까?일대 다 관계 특성에 대한 보호 집합이 설정된 이유
public virtual IList<Order> Orders { get; protected set; }
세터에는 protected
을 지정할 필요가 없습니다. 그렇게하는 것은 좋은 디자인 일뿐입니다.
setter에 액세스 한정자가 지정되지 않은 경우 암시 적으로 해당 속성과 동일한 액세스 한정자 (사용자의 경우 public
)가 있습니다. setter가 public이면 클래스의 모든 소비자가 Orders
속성을 수정하여 다른 인스턴스로 설정할 수 있습니다. 당신이 세터에 protected
액세스 한정자를 정의 할 때
public class Customer
{
public virtual IList<Order> Orders { get; set; }
}
var customer = new Customer();
customer.Orders = new List<Order>();
만 상속 클래스는 속성을 수정할 수 있습니다. 다른 소비자의 경우 Orders
속성은 읽기 전용으로 나타납니다. 이는 실질적으로 encapsulation입니다.
Hibernate는 기본적으로 lazy-loading을 사용합니다. 이것은 일부 속성 (일반적으로 목록)이 즉시로드되지 않지만 첫 번째 용도에서는 사용되는 기술입니다. 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