데이터베이스 초기화 호출을 C# 생성자에 넣어도 괜찮습니까? [닫은

StackOverflow https://stackoverflow.com/questions/159886

  •  03-07-2019
  •  | 
  •  

문제

나는 이것이 다양한 코드베이스라는 것을 보았고, 이것이 일반적으로 눈살을 찌푸렸는지 알고 싶었습니다.

예를 들어:

public class MyClass
{
   public int Id;

   public MyClass()
   {
      Id = new Database().GetIdFor(typeof(MyClass));
   }
}
도움이 되었습니까?

해결책

이것은 일반적으로 좋은 디자인으로 간주되지 않는 몇 가지 이유가 있습니다.이 디자인은 어려운 단위 테스트를 일으키고 취급 오류의 어려움이 이미 언급되었습니다.

내가 그렇게하지 않기로 선택한 주된 이유는 객체와 데이터 액세스 계층이 이제 매우 단단히 결합되어 있기 때문에 원래 디자인 외부의 해당 객체를 사용하려면 상당한 재 작업이 필요합니다. 예를 들어, 해당 클래스의 새 인스턴스를 유지하기 위해 예를 들어 할당 된 값없이 해당 객체를 사용해야하는 인스턴스를 접한다면 어떻게해야합니까? 이제 생성자에 과부하가 걸린 다음 다른 모든 논리 가이 새로운 사례를 처리하거나 상속하고 재정의해야합니다.

객체와 데이터 액세스가 분리 된 경우 인스턴스를 생성 한 다음 수화되지 않을 수 있습니다. 또는 동일한 엔티티를 사용하지만 다른 지속성 계층을 사용하는 다른 프로젝트가있는 경우 객체를 재사용 할 수 있습니다.

과거 프로젝트에서 더 쉬운 커플 링 경로를 취했다고 말했습니다. :)

다른 팁

글쎄 .. 난 아니에요. 그러나 다시 내 접근 방식은 일반적으로 클래스가 자체 데이터를 검색 할 책임이없는 것과 관련이 있습니다.

또한 클래스가 DB 클래스의 모의/스터브 버전을 사용하도록 강요 할 수 없으므로 클래스에 대한 단위 테스트를 작성하기가 어렵습니다. 여기를 봐:http://en.wikipedia.org/wiki/dependency_injection

당신은 사용할 수 있습니다 일회용의 패턴 DB 연결을 참조하는 경우 :

public class MyClass : IDisposable
{
    private Database db;
    private int? _id;

    public MyClass()
    {
        db = new Database();
    }

    public int Id
    {
        get
        {
            if (_id == null) _id = db.GetIdFor(typeof(MyClass));
            return _id.Value;
        }
    }

    public void Dispose()
    {
        db.Close();
    }
}

용법:

using (var x = new MyClass()) 
{
    /* ... */

} //closes DB by calling IDisposable.Dispose() when going out of "using" scope

예, 할 수는 있지만 최고의 디자인은 아니며 생성자의 오류 처리는 다른 곳만큼 깔끔하지 않습니다.

이 접근법에서 내가 생각할 수있는 유일한 문제는 DB 초기화의 오류가 생성자의 예외로 전파된다는 것입니다.

왜 누군가가 실제 대신 모의 물체/스텁을 사용하고 싶어합니까? 자동차 제조업체가 충돌 테스트에 종이 판 모델을 사용해야한다는 데 동의하십니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top