2012-03-21 6 views
1

부분 클래스 내부의 LTS 개체 중 하나에 새 생성자를 추가하고 싶습니다. 데이터베이스에서 오브젝트의 인스턴스를 리턴해야합니다. 기본적 아이디어는LINQ-TO-SQL 개체의 메서드 가져 오기

public Questionnaire(int id) 
{ 
    this = (from q in db.Questionnaires 
      where q.Id == id 
      select q).SingleOrDefault(); 
} 

나는 각각의 속성을 통해 이동하고 반환 된 객체의로 설정하지만 잔인한 것 같아 내가 내 데이터베이스 모델을 변경하면 나는이 코드를 편집 할 수 있도록해야합니다 수 있습니다.

이렇게하는 것이 가장 좋은 방법은 무엇입니까? DataContext는 개체에 대한 변경 내용을 추적 할 수 없기 때문에 정적 메서드를 사용할 수 없습니다.

클래스의 새 인스턴스를 만든 다음 해당 클래스에서 GET 메서드를 호출해야합니까? 즉

public Questionnaire Get(int id) 
{ 
    return (from q in db.Questionnaires 
      where q.Id == id 
      select q).SingleOrDefault(); 
} 

그런 다음이

Questionnaire qs = new Questionnaire(); 
qs = qs.Get(1); 

답변

2

당신은 자신의 블로그 post에 마이크 Hadlow에 의해 제안 구현을 수행하려고 할 수 있습니다 사용합니다.

기본적으로 수행 할 작업은 검색 로직 (및 기타 작업)을 특정 유형의 객체 (예 : 설문지)의 저장소 역할을하는 클래스에 구현하는 것입니다.

그것은 당신의 접근 방식에 다음

var rep = new Repository<Questionnaire>(...); 

var questionnaire = rep.GetById(1); 
+0

. 내가 성취하려고하는 것이 가능한지 알고 싶습니다. – Marko

+0

내 관점에서 볼 때 생성자 안에 새 객체를 만들고 생성중인 객체를 보유하고있는 변수에 할당하기 때문에 첫 번째 솔루션을 피해야합니다. 이상해. 두 번째로 유효한 것은 도메인 객체에 논리를 캡슐화하려는 것입니다. 이 논리는 데이터의 일종의 저장소 (패턴의 이름)에 속해야합니다. – foliveira

+0

제가 게시 한 첫 번째 옵션은 내가 성취하고자하는 것을 설명하려고 시도하는 것입니다. 논리와 도메인 객체를 섞어서는 안되지만 각각의 개별 클래스는 데이터에 액세스하기위한 고유 한 메서드가 필요합니다.Get(), GetAll(), Insert()는 분명히 충분하지 않습니다. Questionnaire 클래스에서 GetAllForClient (...), GetAllForUser (...)와 같은 메서드를 사용하면 User 개체에 GetAllByClient(), GetCurrentUser() 등이 있습니다. 저장소 패턴? – Marko

0

가장 가까운 솔루션과 같은이 DB에서 설문 인스턴스를 검색하는 생성자와 래퍼 클래스를 사용하는 것입니다. 나는 그런 접근법을 싫어한다 (, 위의 저장소와 똑같은 것이 선호 될 것이다). 기본적인 프로그래밍 원칙을 위반 때문에 (this = ...)를 달성하기 위해 노력 무엇

public class QuestionnaireWrapper: Questionnaire { 

    private Questionnaire _q; 

    public QuestionnaireWrapper(int id) 
    { 
     _q = (from q in db.Questionnaires 
      where q.Id == id 
      select q).SingleOrDefault(); 
    } 

    public new string Name 
    { 
     get { return _q.Name; } 
     set { _q.Name = value; } 
    } 

    [Other overrides, all of them] 
} 

하지 수 있습니다. 원격 접근이 불가능한 객체에 대해 원격 랩퍼 (: MarshalByRefObject)를 생성해야 할 때 이러한 접근 방식을 한 번만 사용했습니다. 그리고 저를 믿으십시오, 그것은 깨끗한 접근법이 아닙니다. 제발 분명히 말할 때 나쁜 코드에 대해 나를 downvote하지 마십시오 ;-)

관측 번호. 2 : 코드의 두 번째 부분을 읽음으로써 나는 당신이 가까이있는 것을 발견했습니다. 그래서 정적 메소드가 필요합니다! :)

public static Questionnaire Get(int id) 
{ 
    return (from q in db.Questionnaires 
      where q.Id == id 
      select q).SingleOrDefault(); 
} 

다음

꽤 좋은 개념과 내 문제에 대한 대안 솔루션입니다
Questionnaire qs = Questionnaire.Get(1); 
+0

내가 당신과 콩쿠르를하는 동안,이 경우 Repository 패턴은 조금 지나치게 과장 될 수 있기 때문에 "DataContext가 객체에 대한 변경 사항을 추적 할 수 없기 때문에"정적 메서드를 사용할 수 없다고 그는 말했다. 나는 여전히 이것이 바람직한 접근 방법이라고 생각하지만, 그것은 할 수없는 것처럼 보인다. – foliveira

+0

나는 그 부분을 놓쳤다 :( –

관련 문제