일반적으로 워크플로 애플리케이션 내에서 규칙이 사용되는 경우 규칙은 어셈블리의 일부입니다. 일부 시나리오에서는 워크플로 어셈블리를 다시 빌드하고 배포하지 않고 업데이트할 수 있도록 RuleSets를 어셈블리와 별도로 유지 관리할 수 있습니다. 이 샘플을 사용하면 데이터베이스에서 RuleSets를 관리 및 편집하고 런타임에 워크플로에서 해당 RuleSets에 액세스할 수 있습니다. 이렇게 하면 실행 중인 워크플로 인스턴스가 RuleSet 변경 내용을 자동으로 통합할 수 있습니다.
외부 RuleSet 도구 키트 샘플에는 데이터베이스에서 RuleSet 버전을 관리하고 편집하는 데 사용할 수 있는 Windows Forms 기반 도구가 포함되어 있습니다. 또한 해당 규칙을 실행하기 위한 활동 및 호스트 서비스도 포함됩니다.
비고
이 샘플에는 Microsoft SQL Server가 필요합니다.
Visual Studio는 WF(Windows Workflow Foundation)의 일부로 RuleSet 편집기를 제공합니다. 워크플로에서 활동을 두 번 클릭하여 Policy
이 편집기를 시작할 수 있습니다. 정의된 RuleSet 개체를 워크플로와 연결된 .rules 파일로 직렬화합니다( Policy
활동은 워크플로에 대해 RuleSet 인스턴스를 실행함). .rules 파일은 워크플로 프로젝트를 빌드할 때 리소스로 어셈블리로 컴파일됩니다.
이 샘플의 구성 요소는 다음과 같습니다.
데이터베이스에서 RuleSet 버전을 편집하고 관리하는 데 사용할 수 있는 RuleSet 그래픽 사용자 인터페이스 도구입니다.
호스트 애플리케이션에 구성되고 데이터베이스에서 RuleSets에 액세스하는 RuleSet 서비스입니다.
ExternalPolicy
RuleSet 서비스에서 RuleSet을 요청하고 워크플로에 대해 RuleSet을 실행하는 활동입니다.
구성 요소의 상호 작용은 다음 이미지에 나와 있습니다. 다음 섹션에서는 각 구성 요소에 대해 설명합니다.
RuleSet 도구
다음 이미지는 RuleSet 도구의 스크린샷입니다. 규칙 저장소 메뉴에서 데이터베이스에서 사용 가능한 RuleSets를 로드하고 수정된 RuleSets를 저장소에 다시 저장할 수 있습니다. 애플리케이션 구성 파일은 RuleSet 데이터베이스에 대한 데이터베이스 연결 문자열을 제공합니다. 도구를 시작하면 구성된 데이터베이스에서 RuleSets가 자동으로 로드됩니다.
RuleSet 도구는 RuleSets에 주 버전 및 부 버전 번호를 적용하여 여러 버전을 동시에 유지 관리하고 저장할 수 있습니다(이 도구는 버전 관리 기능 외에 잠금 또는 기타 구성 관리 기능을 제공하지 않음). 도구를 사용하여 새 RuleSet 버전을 만들거나 기존 버전을 삭제할 수 있습니다. 새로 만들기를 클릭하면 도구에서 새 RuleSet 이름을 만들고 버전 1.0을 적용합니다. 버전을 복사할 때 도구는 포함된 규칙을 포함하여 선택한 RuleSet 버전의 복사본을 만들고 고유한 새 버전 번호를 할당합니다. 이러한 버전 번호는 기존 RuleSets의 버전 번호를 기반으로 합니다. 양식의 연결된 필드를 사용하여 RuleSet 이름 및 버전 번호를 변경할 수 있습니다.
규칙 편집을 클릭하면 다음 이미지와 같이 RuleSet 편집기가 시작됩니다.
이는 Windows Workflow Foundation Visual Studio 추가 기능의 일부인 편집기 대화 상자를 다시 호스팅하는 것입니다. Intellisense 지원을 포함하여 동일한 기능을 제공합니다. 규칙은 도구의 RuleSet과 연결된 대상 형식(예: 워크플로)에 대해 작성됩니다. 주 도구 대화 상자에서 찾아보기를 클릭하면 그림 4와 같이 워크플로/형식 선택기 대화 상자가 나타납니다.
그림 4: 워크플로/형식 선택기
워크플로/형식 선택기 대화 상자를 사용하여 어셈블리와 해당 어셈블리 내의 특정 형식을 지정할 수 있습니다. 이 형식은 규칙을 작성하고 실행하는 대상 형식입니다. 대부분의 경우 대상 형식은 워크플로 또는 다른 작업 유형입니다. 그러나 모든 .NET 형식에 대해 RuleSet을 실행할 수 있습니다.
데이터베이스에서 RuleSet을 검색할 때 도구가 대상 형식 name are stored with the
을 자동으로 로드하려고 시도하도록 데이터베이스의 어셈블리 파일 및 RuleSet 형식에 대한 경로입니다.
워크플로/형식 선택기 대화 상자에서 [확인]을 클릭하면 규칙 집합에 대해 선택한 형식의 유효성을 검사하여 대상 형식에 규칙이 참조하는 모든 멤버가 있는지 확인합니다. 오류는 유효성 검사 오류 대화 상자에 표시됩니다. 오류에도 불구하고 변경을 계속하도록 선택하거나 취소를 클릭할 수 있습니다. 주 도구 대화 상자의 도구 메뉴에서 유효성 검사를 클릭하여 대상 활동에 대해 RuleSet 버전의 유효성을 다시 검사할 수 있습니다.
도구의 데이터 메뉴에서 RuleSets를 가져오고 내보낼 수 있습니다.
가져오기를 클릭하면 .rules 파일을 선택할 수 있는 파일 선택 대화 상자가 나타납니다. Visual Studio에서 처음에 만든 파일일 수도, 그렇지 않을 수도 있습니다. .rules 파일에는 조건 컬렉션과 RuleSets 컬렉션이 포함된 직렬화된 RuleDefinitions
인스턴스가 포함되어야 합니다. 이 도구는 조건 컬렉션을 사용하지 않지만 .rules 형식을 RuleDefinitions
사용하여 Visual Studio 환경과의 상호 작용을 허용합니다.
.rules 파일을 선택하면 RuleSet 선택기 대화 상자가 나타납니다. 이 대화 상자를 사용하여 가져올 파일에서 RuleSets를 선택할 수 있습니다(기본값은 모든 RuleSets를 지정). .rules 파일의 RuleSets에는 버전 번호가 없습니다. WF 프로젝트 내의 버전 관리가 어셈블리 버전과 동일하기 때문입니다. 가져오기 프로세스 중에 도구는 사용 가능한 다음 주 버전 번호를 자동으로 할당합니다(가져온 후 변경할 수 있음). RuleSet 선택기 목록에서 할당된 버전 번호를 볼 수 있습니다.
가져오는 각 RuleSet에 대해 도구는 RuleSet에 사용된 멤버에 따라 .rules 파일(있는 경우)의 위치 아래에 있는 bin\Debug 폴더에서 연결된 형식을 찾으려고 시도합니다. 도구에서 일치하는 형식을 여러 개인 경우 .rules 파일 이름과 형식 이름 간의 일치를 기반으로 형식을 선택하려고 시도합니다(예: 형식은 Workflow1
Workflow1.rules에 해당). 여러 일치 항목이 있는 경우 형식을 선택하라는 메시지가 표시됩니다. 이 자동 식별 메커니즘이 일치하는 어셈블리 또는 형식을 찾지 못하는 경우 가져온 후 주 도구 대화 상자에서 찾아보기를 클릭하여 연결된 형식으로 이동할 수 있습니다. 다음 이미지는 RuleSet 선택기를 보여 줍니다.
주 도구 메뉴에서 데이터 내보내 기를 클릭하면 RuleSet 선택기 대화 상자가 다시 나타나며, 이 대화 상자에서 내보낼 데이터베이스에서 RuleSets를 확인할 수 있습니다. [확인]을 클릭하면 결과 .rules 파일의 이름과 위치를 지정할 수 있는 파일 저장 대화 상자가 나타납니다. .rules 파일에는 버전 정보가 포함되어 있지 않으므로 지정된 RuleSet 이름을 가진 하나의 RuleSet 버전만 선택할 수 있습니다.
PolicyFromService 작업
작업에 대한 PolicyFromService
코드는 간단합니다. WF와 함께 제공되는 활동과 비슷하 Policy
게 작동하지만 .rules 파일에서 대상 RuleSet을 검색하는 대신 호스트 서비스를 호출하여 RuleSet 인스턴스를 가져옵니다. 그런 다음 루트 워크플로 활동 인스턴스에 대해 RuleSet을 실행합니다.
워크플로에서 활동을 사용하려면, 워크플로 프로젝트에서 PolicyActivities
및 RuleSetService
어셈블리에 대한 참조를 추가하세요. 도구 상자에 활동을 추가하는 방법에 대한 자세한 내용은 이 항목의 끝에 있는 절차를 참조하세요.
워크플로에 활동을 배치한 후 실행할 RuleSet의 이름을 제공해야 합니다. 이름을 리터럴 값으로 입력하거나 다른 활동의 워크플로 변수 또는 속성에 바인딩할 수 있습니다. 필요에 따라 실행해야 하는 특정 RuleSet의 버전 번호를 입력할 수 있습니다. 주 버전 및 부 버전 번호의 기본값인 0을 그대로 두면 데이터베이스의 최신 버전 번호가 작업에 대해 자동으로 제공됩니다.
RuleSet 서비스
서비스는 데이터베이스에서 지정된 RuleSet 버전을 검색하고 호출 활동으로 반환하는 작업을 담당합니다. 앞에서 설명한 것처럼 호출에 GetRuleSet
전달된 주 버전 및 부 버전 값이 모두 0이면 서비스는 최신 버전을 검색합니다. 이 시점에서는 RuleSet 정의 또는 인스턴스의 캐싱이 없습니다. 마찬가지로, 진행 중인 RuleSets와 구분하기 위해 RuleSet 버전을 "배포됨"으로 표시하는 기능이 없습니다.
서비스에서 액세스할 데이터베이스는 애플리케이션 구성 파일을 사용하여 호스트에서 구성해야 합니다.
도구를 실행하려면
도구 및 서비스에 사용되는 RuleSet 테이블을 설정하는 폴더에는 Setup.sql 파일이 포함되어 있습니다. Setup.cmd 배치 파일을 실행하여 SQL Express에서 Rules 데이터베이스를 만들고 RuleSet 테이블을 설정할 수 있습니다.
일괄 처리 파일 또는 Setup.sql 편집하고 SQL Express를 사용하지 않도록 지정하거나 테이블이 아닌
Rules
다른 데이터베이스에 배치하도록 지정하는 경우 RuleSet 도구 및UsageSample
프로젝트의 애플리케이션 구성 파일을 동일한 정보로 편집해야 합니다.Setup.sql 스크립트를 실행한 후 솔루션을 빌드
ExternalRuleSetToolkit
한 다음 ExternalRuleSetTool 프로젝트에서 RuleSet 도구를 시작할 수 있습니다.RuleSetToolkitUsageSample
순차 워크플로 콘솔 애플리케이션 솔루션에는 샘플 워크플로가 포함됩니다. 워크플로는PolicyFromService
활동과 두 개의 변수,orderValue
및discount
에 대해 대상 RuleSet이 실행되는 것으로 구성됩니다.샘플을 사용하려면 먼저
RuleSetToolkitUsageSample
솔루션을 빌드하십시오. 그런 다음 RuleSet 도구 주 메뉴에서 데이터 가져오기 를 클릭하고 RuleSetToolkitUsageSample 폴더의 DiscountRuleSet.rules 파일을 가리킵니다. 가져온 RuleSet을 데이터베이스에 저장하려면 규칙 저장소 저장 메뉴 옵션을 클릭합니다.PolicyActivities
어셈블리는 샘플 워크플로 프로젝트에서 참조되므로PolicyFromService
액티비티가 워크플로에 나타납니다. 그러나 기본적으로 도구 상자에 표시되지는 않습니다. 도구 상자에 추가하려면 다음을 수행합니다.도구 상자를 마우스 오른쪽 단추로 클릭하고 항목 선택을 선택합니다 (시간이 오래 걸릴 수 있음).
도구 상자 항목 선택 대화 상자가 나타나면 [활동] 탭을 클릭합니다.
솔루션에서
PolicyActivities
어셈블리를 찾아ExternalRuleSetToolkit
를 클릭합니다.PolicyFromService
도구 상자 항목 선택 대화 상자에서 활동이 선택되어 있는지 확인하고 확인을 클릭합니다.이제 작업이 RuleSetToolkitUsageSample 구성 요소 범주의 도구 상자에 표시됩니다.
RuleSet 서비스는 Program.cs 다음 문을 사용하여 콘솔 애플리케이션 호스트에 이미 구성되어 있습니다.
workflowRuntime.AddService(new RuleSetService());
구성 파일을 사용하여 호스트에서 서비스를 구성할 수도 있습니다. 자세한 내용은 SDK 설명서를 참조하세요.
애플리케이션 구성 파일이 워크플로 프로젝트에 추가되어 서비스에서 사용할 데이터베이스에 대한 연결 문자열을 지정합니다. RuleSet 테이블이 포함된 데이터베이스를 가리키는 RuleSet 도구에서 사용하는 것과 동일한 연결 문자열이어야 합니다.
이제 다른 워크플로 콘솔 애플리케이션과 마찬가지로 프로젝트를 실행할
RuleSetToolkitUsageSample
수 있습니다. Visual Studio 내에서 F5 또는 Ctrl+F5를 누르거나 RuleSetToolkitUsageSample.exe 파일을 직접 실행합니다.비고
도구가 사용 샘플 어셈블리를 로드하기 때문에 사용 현황 샘플을 다시 컴파일하려면 RuleSet 도구를 닫아야 합니다.
.NET