DSL : DSL 규칙에서 C# 표현식으로
-
09-09-2019 - |
문제
문제는 아마도 복합 일 것입니다. 확장하겠습니다.
- 존재합니까? 디자이너 (스텁/프레임 워크/메타 디자이너) .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 응용 프로그램에서 호스팅 할 수 있다는 것은 알려진 사실입니다. 이러한 방식으로 작성된 규칙은 실제 워크 플로와 독립적으로 비슷하게 평가 될 수 있습니다.