2013-03-15 1 views
1

내 응용 프로그램에 n 계층 아키텍처가 있습니다. 나는 다른 계층을 가지고있다 (비즈니스 로직 & 데이터 링크 & GUI). 하나의 레이어에서 다른 레이어로 데이터를 전달하기 위해 몇 가지 공통 클래스를 사용하고 있습니다. 나는 두 개의 변수 Return valueReturn Message을 가진 클래스 (예 : RetrnValueCls)를 가지고있다. 한 레이어에서 다른 레이어로 데이터를 전달하는 동안 다른 변수가있는 다른 클래스 (예 : MasterItemsCls)와 함께 Return Value 클래스를 반환해야합니다. 다음은 C#에서는 한 레이어에서 다른 레이어로 반환 유형으로 두 개의 다른 클래스를 전달할 수 있습니까?

는 방법이 있습니다

public MasterItemsCls GetMasterItemsMDL() 
{ 
    /* Does some computations and assign them to 
    attributes of MasterItemsCls and pass it other methods in other layers. */ 
} 

public ReturnValueCls GetMasterItemsMDL() 
{ 
    /* Does some computations and assign them to 
    attributes of ReturnValueCls and pass it other methods in other layers. */ 
} 

내가 한 번 방법 GetMasterItemsMDL에 대한 반환 형식으로 모두 위의 클래스 (MasterItemsCls & ReturnValueCls)을 반환하고, 또한 내가 수업을 모두 결합하지 않으려합니다. 제가 할 수있는 어떤 방법이 있다면 알려주십시오.

답변

7

함수는 하나의 값만 반환 할 수 있으므로 그 의미는 대답이 아닙니다.

함수에는 out 매개 변수가있을 수 있으므로 out 매개 변수를 통해 두 값 중 하나를 반환 할 수 있습니다.

내 의견으로는 이것을 처리하는 가장 깨끗한 방법은 세 번째 클래스를 사용하여 다른 두 클래스를 포함하는 것입니다. Tuple<T1,T2>는 그 목적을 위해 사용될 수있다 :이

public Tuple<MasterItemsCls, ReturnValueCls> MyFunction() 
{ 
    // Do stuff 
    return new 
    Tuple<MasterItemsCls, ReturnValueCls>(myMasterItemsCls, myReturnValueCls); 
} 

Tuple<T1,T2> 하나의 결점은 값이 Item1Item2 오히려 직관적으로 접속된다는 점이다.

Tuple<T1,T2>을 사용하지 않으려는 경우 MasterItemsClsReturnValueCls을 포함하는 클래스를 쉽게 만들 수 있습니다. 이것이 내가 선호하는 접근 방식이다.

+1

+1하면 C#에서'Tuple's를 사용하는 경우 가끔 읽을 방법이없는 코드를 얻는 방법에 대해 알아 봅니다. 예를 들어'tuple.Item1 + tuple.Item2 - tuple.Item3'은 가독성을 불어 넣습니다. –

+0

@IlyaIvanov : 튜플은 편리 할 수 ​​있지만 일반적으로 바로 그 이유 때문에 맞춤 클래스를 만드는 데 시간이 걸립니다. –

+0

주관적이지만 동의하지만 튜플은 F #으로 작성된 부분을 C# 코드와 통합하는 좋은 방법이라고 생각합니다. F #은 패턴 매칭과 같이 Tuples를 다루기에 꽤 괜찮은 메커니즘을 가지고 있습니다. 필자는 투플을 프로젝트에 통합하려고 시도했지만 두 가지 이상의 일반적인 매개 변수를 사용하지는 않으며 매우 드물게 사용합니다. –

6

두 클래스를 결합 할 필요는 없지만 반환하려는 각 클래스의 인스턴스가 하나 포함 된 클래스를 생성하는 것이 가능합니다.

public class YouClassName 
{ 
    public MasterItemsCls MasterItemsCls {get; set;} 
    public ReturnValueCls ReturnValueCls {get; set;} 
} 
0

메서드는 하나의 개체 만 반환 할 수 있습니다. 당신은 이들 각각의 인스턴스를 가진 다른 클래스를 만들 수 있습니다.

0

Generics는 반환 요소의 래퍼로 유용 할 수 있습니다.

는 다음을 수행 할 수 있습니다 :

public ReturnValueCls<MasterItemsCls> GetMasterItemsMDL() 
{ 

} 

귀하의 ReturnValueCls<T>는 반환 유형에 대한 유형 매개 변수를 기대하고있다. 그래서 당신의 retun 유형은 원하는 리턴에 대한 래퍼 역할을 할 수 있고 리턴 메시지를 유지할 수 있습니다.


클래스 정의의 예입니다. 몇 가지 제약 조건이 필요할 수 있습니다 :

관련 문제