Model 클래스의 DataAnnotation
특성을 사용하여 유효성 검사를 수행하고 있으며, Model 클래스는 응용 프로그램의 클라이언트 및 서버 쪽에서 유효성 검사에 사용됩니다.순환 참조를 발생시키지 않고 LazyLoading을 WCF와 함께 사용하려면 어떻게해야합니까?
내 문제는 내가 어떻게 게으른로드 내 모델의 속성을 순환 참조를 포함
라이브러리를 유발하지 않고 알아낼 수 없습니다 것은 다음과 같습니다
- WCF 서비스 라이브러리
- 클라이언트 측 DATAACCESS 도서관 도서관
- 모델
모델 천칭 자리 때문에 데이터 유효성 검사를 위해 클라이언트 측과 서버 측에서 모두 사용됩니다. 모델 라이브러리 내에서 DataAccess 라이브러리를 참조 할 수 없습니다. 따라서, 어떻게 게으른 로딩을 설정할 수 있습니까?
예를 들어, 나는 게으른로드되어야 PhoneNumbers의 속성을 가진 ConsumerModel 있습니다. Client-Side DAL을 참조하지 않고 ConsumerModel 내에서 PhoneNumberModels를로드하려면 어떻게해야합니까?
클라이언트 측 DAL :
using MyModels;
public class ConsumerDataAccess
{
public ConsumerModel GetConsumerById(int id)
{
ConsumerDTO dto = WCFService.GetConsumer(id);
return new ConsumerModel(dto);
}
}
ConsumerModel :
public class ConsumerModel
{
public ObservableCollection<PhoneNumberModel> _phoneNumbers;
public ObservableCollection<PhoneNumberModel> PhoneNumbers
{
get
{
if (_phoneNumbers == null)
{
// Can't reference DataAccess Library since that would cause a Circular Reference
}
}
}
}
나는이 구조 작업을 할 수있는 몇 가지 다른 방법은 무엇입니까?
나는 모델에 대한 유효성 확인을 유지하고 유효성 검사를 위해 클라이언트 및 서버 측의 모델을 사용하는 것을 선호합니다. 나는 또한 유효성 검사를 위해 DataAnnotation을 계속 사용하는 것을 선호한다.
편집
사람이 관심이 있다면 여기에 로렌스 Wenham의 답변에 따라 내 최종 솔루션입니다. 나는 이벤트 대신 델리게이트를 사용했다.
DAL :
public class ConsumerDataAccess
{
public ConsumerModel GetConsumerById(int id)
{
ConsumerDTO dto = WCFService.GetConsumer(id);
ConsumerModel rtnValue = new ConsumerModel(dto);
ConsumerModel.LazyLoadData = LazyLoadConsumerData;
return rtnValue;
}
}
private object LazyLoadConsumerData(string key, object args)
{
switch (key)
{
case "Phones":
return PhoneDataAccess.GetByConsumerId((int)args);
default:
return null;
}
}
모델 라이브러리 :
public class ConsumerModel
{
public delegate object LazyLoadDataDelegate(string id, object args);
public LazyLoadDataDelegate LazyLoadData { get; set; }
public ObservableCollection<PhoneNumberModel> _phoneNumbers;
public ObservableCollection<PhoneNumberModel> PhoneNumbers
{
get
{
if (_phoneNumbers == null && LazyLoadData != null)
{
_phoneNumbers = (ObservableCollection<PhoneNumberModel>)
LazyLoadData("Phones", ConsumerId);
}
return _phoneNumbers;
}
}
}
나는 실제로 전화 번호 정보를로드하기 위해 DAL을 호출하는 것이 무엇인지를 잘 모르겠다. – Rachel
수정 된 답변보기 LazyLoadData의 이벤트 핸들러는 DAL을 호출하는 것입니다. 로드 할 데이터를 식별하는 가장 좋은 방법을 찾아야합니다. 나의 예제에서 나는 어떤 종류의 문자열과 'Key'를 사용했다.하지만 열거 형을 사용할 수 있고, if (sender가 ConsumerModel)와 같은 것들과 결합 할 수있다. 모델에서 DAL을 유지합니다. –
그래도 순환 참조 문제가 발생하지 않습니까? 모델은 Observers 라이브러리에 대해 알아야하며, Observers는 모델 라이브러리에 대해 알아야합니다. 내 원래의 문제는 모델 라이브러리에서 DAL을 참조 할 수 없다는 것입니다. 그래서이 둘을 결합 할 수 없습니다. – Rachel