문제

문제는 아마도 복합 일 것입니다. 확장하겠습니다.

  • 존재합니까? 디자이너 (스텁/프레임 워크/메타 디자이너) .NET Object Public Bool 속성을 기반으로 규칙을 작성 및/또는 기반으로 하는가? DSL/BOO/... 출력으로 저장.
  • 컴파일 할 수 있습니까? C#에 DSL 출력 표현?

우리의 주요 문제는 문서와 코드의 간격입니다. 수백 개의 사용자 정의 규칙을 기반으로 한 제품과 변경 요청 속도를 높이고 자합니다.

사용자에게 간단한 디자이너를 제공하고 출력을 가져올 수 있다면 C#/IL 코드로 변환/컴파일 한 후 빠른 변경 요청주기가 있습니다.

나는 우리의 문제가 구체적이지만 "벽의 벽돌"이라는 것을 알고 있습니다.

예시:

AC# 클래스, 주제 :

public class TestA
{
     public bool B {...}
     public bool C {...}
}

디자이너에서는 만들 수 있어야합니다

  • 모든 유형의 그래픽 디자이너 (예 : 공개 속성 선택을위한 드롭 다운)

DSL의 출력 :

If TestA.B AND TestA.C Then Return True;

C#의 출력 :

if (testA.B && testA.C) { return true; }

업데이트 #1

정적 유형 .NET 클래스를 사용하여 지원하는 DSL 언어에 기뻐할 것입니다. 사용자가 코드를 확인할 수있는 경우 ("DSL의 출력" 예에서), 우리는 디자이너가 필요하지 않습니다.

업데이트 #2

팁을 바탕으로, 나는 표현 나무를 쳐다 보았다. 며칠 후 나는 Dlinq에 도망갔습니다 - 나는 Dlinq의 열렬한 팬이 아니었지만이 경우 문제 도메인에 잘 맞습니다.

  • 쉽게 구문 분석 (A> 2 및 B <4) 또는 C = 5 표현 나무로
  • 그런 식을 쉽게 만들 수 있습니다
  • 직렬화/사제화하기가 매우 쉽습니다
  • FlowLayoutPanel을 기반으로 GUI는 "Expression Builder"로 잘 작동합니다.
도움이 되었습니까?

해결책

당신은 이와 같은 것을 자신의 자신을 만들 수 있습니다.

type.getMembers ()를 사용하여 클래스의 모든 공개 속성 목록을 얻을 수 있습니다.

그러나 C# 코드를 생성하는 대신 표현 나무를 사용합니다.

이렇게하면 사용자가 규칙을 변경할 때 C# 컴파일러를 포함 할 필요가 없습니다. 대신 규칙을 데이터베이스에 저장하고 런타임에로드 한 다음 expression.compile () 메소드를 사용하여 코드를 실행하도록 호출 할 수있는 대의원을 만듭니다.

업데이트:

의견에서 누군가가 "표현 용기와 도메인 특정 언어의 차이점은 무엇입니까?"라고 물었습니다.

답은 다음과 같습니다.

표현 나무와 도메인 특정 언어는 직교입니다.

Expression Tress는 C# 표현식을 나타내는 API 일 뿐이며, 편리하게 런타임에 동적으로 대의원으로 변환 될 수 있습니다.

DSL 또는 도메인 특정 언어는 좁은 클래스의 문제를 해결하도록 설계된 프로그래밍 언어입니다.

그들은 본질적으로 완전히 다른 것들입니다.

원하는 경우 DSL 구현의 일부로 발현 트리를 사용할 수 있습니다. LINQ는 그 목적으로 그것들을 사용합니다.

그러나 귀하의 경우 DSL이 필요하지 않습니다. 필요한 것은 규칙을 생성하는 사용자 인터페이스 (Outlook의 작동 방식과 유사) 및 해당 규칙을 실행하는 방법입니다.

UI를 만드는 것은 정상적인 UI 개발 일뿐입니다.

표현 나무는 규칙을 구현하는 데 사용할 수있는 것입니다.

다른 팁

Windows Workflow Foundation 용 디자이너와 특히 규칙 엔진을 비주얼 스튜디오와 별개로 Windows Forms 응용 프로그램에서 호스팅 할 수 있다는 것은 알려진 사실입니다. 이러한 방식으로 작성된 규칙은 실제 워크 플로와 독립적으로 비슷하게 평가 될 수 있습니다.

보다 WF 시나리오 지침 : 워크 플로 디자이너 리 호스팅 그리고 튜토리얼 : WF 디자이너 호스팅.

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