2009-09-15 2 views
3

각 Business Object에는 SQL 호출이 들어있는 일치하는 오브젝트가 있습니다. 일치하는 비즈니스 개체에서만 사용할 수있는 방식으로 이러한 SQL 개체를 제한하고 싶습니다. 어떻게이 일을 성취 할 수 있습니까?동일한 어셈블리의 다른 하나의 객체에서만 객체에 액세스 할 수있게 만드시겠습니까?

업데이트

그렉 시험 가능성에 대한 포인트를 가져왔다. SqlObjects에는 비즈니스 프로세스 고유의 SQL이 많이 포함되어 있으므로 여러 가지 buiness 객체에서 재사용하지 않아야합니다. (기본 CRUD 작업은 모두 코드 생성됩니다.) 비즈니스 어셈블리의 한 비즈니스 개체 (예 : yshuditelu 및 Greg Beech)에서 SqlObjects에 액세스 할 수있게 만들고 SqlObjects를 단위 테스트 어셈블리에 노출시키는 방법이 있습니까?

답변

9

원하는 방식이거나 취할 필요가있는 방식 인 경우 비즈니스 개체 내에서 sql 개체를 개인 클래스로 만들 수 있습니다.

public class BusinessObject 
{ 
    private class SqlObject { } 
} 

또한 부분 클래스를 사용하여 원하는 경우이를 별도의 파일로 분리 할 수 ​​있습니다.

//in one file 
public partial class BusinessObject 
{ 
    //business object implementation 
} 

//in another file 
public partial class BusinessObject 
{ 
    private class SqlObject { } 
} 

Joel

아래 코멘트에 좋은 지적한다 "는 SQLObject의 여전히 일반적인 유형에서 상속 할 수 있습니다에 대한 연결 정보 같은 것들이 그에서 공유 할 수있다"내부 "클래스." 이것은 절대적으로 사실이며 잠재적으로 매우 유익합니다.

단위 테스트는 편집에 대한 응답으로 테스트에서 리플렉션을 사용하지 않고 공용 클래스와 함수 만 테스트 할 수 있습니다. 이런 짓을 했을까 내가 그 생각할 수있는 유일한 옵션은 다음과 같습니다

  • 이 (가) private class SqlObjectinternal class SqlObject
  • 다음 프로젝트
에 대한 [InternalsVisibleTo("UnitTestsAssembly")] 사용하여 변화하는 비즈니스/SQL 오브젝트 쌍
  • 당 하나의 어셈블리를 만들

    또한이 시점에서 sql 개체를 중첩 클래스로 유지할 필요가 없습니다. 일반적으로 이것은 이것이 추가하는 가치보다 더 복잡 할 가능성이 높다고 생각하지만, 모든 상황이 다르다는 것을 완전히 이해하고 있으며, 귀하의 요구 사항/기대가 당신에게이 사실을 알리는 것이라면, 나는 당신이 잘되기를 바랍니다. 개인적으로, SqlObjects를 공개 (또는 내부 테스트를 위해 내부가 보이는 내부)로 만들고 SQL 클래스가 모든 비즈니스 클래스에 노출된다는 사실을 받아 들일 것입니다.

  • +3

    또한 SqlObject는 연결 정보가 "내부"클래스에서 공유 될 수 있도록 공용 유형에서 상속받을 수 있습니다. –

    +0

    감사합니다. 이미 코드 생성을 위해 부분 클래스를 사용하고 있습니다. 나는 Dependency Injection을 위해 SQL을 분리 할 것이다. 귀하의 접근 방식은 내 템플릿을 거의 변경하지 않아도됩니다! – adam0101

    4

    이 테스트 가능성의 관점에서 좋은 생각이 있는지 여부, 즉, 그것은 SQL 개인 중첩 된 오브젝트 유형 만들 것입니다

    public class BusinessObject 
    { 
        private class SqlObject 
        { 
        } 
    } 
    

    할 수있는 유일한 방법은 또 다른 문제 완전히 ...

    입니다
    +0

    테스트 가능성에 대한 좋은 지적입니다. 이 작업을 수행하고 SqlObject 클래스를 유닛 테스트 어셈블리에 노출 시키지만 다른 비즈니스 객체에는 노출시키지 않는 방법이 있습니까? – adam0101

    0

    C++에서 프렌드 클래스를 구현하는 데 attmepting하고 있습니다. 내가 아는 한 C#과 VB.Net에는 아무 것도 없다. 내 유일한 제안은 클래스에 액세스해야하는 클래스의 내부 클래스를 제한하려는 클래스를 만드는 것입니다.

    0

    두 개의 어셈블리 (비즈니스 오브젝트 용과 관련 SQL 오브젝트 용)로 작업하고 각 SQL 클래스에 내부 수정자를 사용하고 SQLAssembly에 [InternalsVisibleTo("BusinessObjectAssembly")]을 사용할 수 있습니다.