2011-02-15 2 views
0

클래스 라이브러리의 메서드 내에서 Form을 채우려면 어떻게해야합니까? 그래서 Method1() 아래의 예에서 그게 무엇입니까.루프 중에 다른 클래스의 입력 (양식을 통해)을 요청하는 방법?

Project "UI", Windows Forms Application 
reference to MyLib 
public class Form1 : Form 
{ 
    ... 
    call some methods from MyLib.MyClass 
    ... 
} 

Project "MyLib", Class Library 
public class MyClass 
{ 
    ... 
    public void Method1() 
     { 
      loop through an array and ask user to validate some data on the form during each iteration 
     } 
} 

UPDATE : 더 구체적으로는 MYLIB 라이브러리는 List<string[]> 통하여 (각 행 List<string[]>에 첨가한다) 배열로 .csv 파일을로드 클래스 의지 루프 이상 포함 "가능한"중복을 찾고 있습니다. 하나가 발견 될 때마다 사용자는 두 레코드를 함께 (양식에서) 제시해야만 궁극적으로 동일한 지 여부를 결정할 수 있습니다.

+0

클래스 라이브러리 MyLib이 일반 및 백엔드이기 때문에 UI와 관련이 없으며 UI 요소 나 메시지 상자 및 사용자 상호 작용에 대해 모르는 경우 유효성 검사 로직을 UI로 이동하여 전달해야한다고 생각합니다. 라이브러리는 검증 된/좋은 입력 만 유효합니다. –

+0

@Davide Piras - IMHO 라이브러리가 유효성 검사도 처리해야합니다. 왜냐하면 유효성 검사는 "유효하지 않은 날짜 형식"유효성 검사를 의미하지 않는 한, 전달 된 데이터를 UI가없는 다른 데이터와 비교하기 때문입니다. UI는 구문 분석 등의 구문 분석을 처리해야하지만 논리적 의미 론적 유효성 검사는 데이터 라이브러리에서 처리해야합니다. –

+0

라이브러리의 입/출력 유효성 검사와 사용자 입력의 유효성 검사 간에는 차이가 있습니다. UI/모델 계층은 '비즈니스'규칙 만 알고 있기 때문에 실제로 사용자 입력 유효성 검사를 처리해야합니다. –

답변

1

클래스 라이브러리의 메서드 내에서 Form을 채우려면 어떻게해야합니까?

진짜 질문은 왜하고 싶습니까? 도서관은 이와 같은 것에 대해 책임을지지 않습니다. 이것은 라이브러리가 일반적으로 사용되는 것이 아니라 워크 플로와 UI에 특정한 논리입니다. 라이브러리는 유용한 데이터 구조를 제공해야하지만 응용 프로그램과 관련된 사항 (예 : 입력 내용 수집 및 처리 방법 결정)은 코드에서 처리해야합니다.

어쨌든 ... 나는이 말을 조금 더러워합니다. 여러분은 항상 폼 형식에 대한 참조를 메서드에 대한 인수로 전달할 수 있습니다 (다른 것들 중에서도 두 어셈블리를 단단히 연결하는 접근법). 다른없이 사용할 수 없게 한) ...

전율을 만드는 것은

+0

더러워 졌음에도 +1. –

+0

때로는 더러워지기에 좋은 느낌이 들지만 ... 이번에는 D –

+0

답장을 보내 주셔서 감사합니다! –

0

당신은 크로스 /가 원형-참조 사용할 수 있지만,이 때문에 여러 가지 이유로 권장하지 않습니다.

클래스 라이브러리 내에서 Form 유형 객체 (더 정적 인 경우 더 좋음)를 선언하고 해당 양식을 참조로 전달할 수도 있습니다. 그렇지 않은 경우 "Controls"멤버를 통해 참조 된 변수 내에서 자식 컨트롤을 호출 할 수 있습니다 잘못된.

0

에드가 최종 댓글을 달았음에도 불구하고 마! 물론 가능하지만 이해가되지 않습니다. 유혹에 저항하십시오!

라이브러리는 일부 일반적인 기능, 즉 데이터 구조, 로직 메소드 또는 P/Invoke 메소드를 제공해야합니다. 그러나 폼 클래스에서 UI에 대한 논리적 인 부분이 있습니다. 유효성 검사를 처리하기 위해 Form1에서 메서드를 만듭니다. 그것은 훨씬 쉽고 훨씬 더 명확해질 것입니다.

+0

그래, 말했듯이 ... 더럽고 더러운 조언. 바라기를 나의 코멘트는 그를 조금 돕는다. –

0

엄청난 질문입니다.

가장 쉬운 방법은 클래스 lib의 System.Windows.Forms에 대한 참조를 추가하는 것입니다. 그런 다음 창을 비즈니스 클래스의 인수로 전달하십시오. 하지만이 솔루션은 쉽지만 깨끗한 방법은 아닙니다. 깨끗한 계층화 된 아키텍처에서는 하위 레이어의 객체를 사용할 수 없습니다. 컴파일하는 것이나 유지 보수 블랙홀 일 수 있습니다. 더욱이, 이러한 경우를 단위 테스트하는 것은 복잡합니다.

이 점을 고려하면 조금 더 복잡한 또 다른 해결책은 제어의 반전을 사용하거나, Unity, Mef 또는 다른 것과 같은 프레임 워크를 사용하거나 수동으로 수행하는 것입니다.

주요 아이디어는 클래스 라이브러리에 같은 사용자 상호 작용을 정의하는 인터페이스를 생성하는 것입니다 :

public class Form1 : Form, IInputValidator { 

    public void CallBusinessClass() { 
     var myObj = new BusinessClass(this); // the key of the concept is here 
     myObj.Iterate(); 
    } 
    public bool IsValid(MyClass itemToValidate) { 
     return MessageBox.Show("Is valid ?", MessageBoxButtons.YesNo) == MessageBoxButtons.Yes); 
    } 
}  

:

public interface IInputValidator { 
    bool IsValid(MyClass itemToValidate); 
} 

을 그런 다음 윈도우 폼 응용 프로그램을,이 인터페이스를 구현 그런 다음 비즈니스 클래스에서

public class BusinessClass { 
    private IInputValidator m_validator; 
    public BusinessClass(IInputValidator validator) { 
     this.m_validator = validator; 
    } 

    public void Iterate() 
    { 
     foreach(var item in ItemsToIterate) 
     { 
      var isValid = m_validator.IsValid(item); // call the upper layer from a lower layer 
     } 
    } 
} 

희망을

관련 문제