분류

C# 도메인 개체를 사용하여 카우치베이스 뷰 정의하기

카우치베이스 클라이언트 라이브러리 1.2-베타에는 몇 가지 기본 클러스터 관리를 위한 새로운 API가 포함되어 있습니다. 버킷을 생성, 제거 및 나열하는 메서드가 있습니다. 디자인 문서를 관리하기 위한 유사한 메서드도 있습니다. 다음과 같은 새로운 기능은 새 클래스에서 찾을 수 있습니다. 카우치베이스클러스터아래의 Couchbase.Management 네임스페이스. 이 새로운 API의 가장 큰 장점은 애플리케이션이 시작될 때 버킷을 생성하고 디자인 문서를 설정할 수 있다는 점입니다.

새 디자인 문서를 만들기 위한 오버로드 중 하나를 사용하면 스트림 를 디자인 문서의 소스로 사용할 수 있습니다. 이 버전을 사용하면 파일 집합에서 디자인 문서를 쉽게 만들 수 있습니다. 문서가 포함된 문자열을 지정할 수도 있습니다.

최근에 이러한 디자인 문서 관리 방법을 사용하여 기본 보기 생성을 자동화하는 간단한 명령줄 유틸리티를 만들자는 아이디어가 떠올랐습니다. 이 아이디어의 결과물이 GitHub에 올라와 있습니다. https://github.com/jzablocki/couchbase-model-views. 이 프레임워크를 사용하면 기존 모델 클래스를 사용자 지정 속성으로 꾸미는 것만으로 뷰 생성을 자동화할 수 있습니다.

다음을 고려하십시오. 맥주 클래스에는 이름, 설명, 양조장 및 ABV 속성이 있습니다.

public 클래스 맥주
{
public 문자열 Id { get; set; }

public 문자열 이름 { get; set; }

public 문자열 설명 { get; set; }

public float ABV { get; set; }

public 문자열 양조장 { get; set; }
}

이 클래스는 카우치베이스 버킷의 "맥주" 문서에 매핑됩니다.

{
"name": "사무엘 아담스 썸머 에일",
"abv": 5.2,
"type": "맥주",
"brewery_id": "110f04db06",
"설명": "밝고 시트러스한 맛, 신비한 곡물로 양조한...
}

이 매핑을 달성하려면 다음을 사용할 수 있습니다. 뉴턴소프트.Json의 프로퍼티 매핑 속성입니다.

public 클래스 맥주
{
public 문자열 Id { get; set; }

[제이슨 프로퍼티("name")]
public 문자열 이름 { get; set; }

[제이슨 프로퍼티("설명")]
public 문자열 설명 { get; set; }

[제이슨 프로퍼티("abv")]
public float ABV { get; set; }

[제이슨 프로퍼티("breweryId")]
public 문자열 양조장 { get; set; }
}

에 있는 두 가지 새로운 속성을 사용하여 CouchbaseModelViews.Framework 프로젝트에서 이 클래스를 추가로 장식하여 이 클래스의 어떤 속성을 Couchbase Server에서 인덱싱할지 선언할 수 있습니다. 이러한 속성은 다음과 같습니다. 카우치베이스디자인문서 그리고 카우치베이스뷰키.

[카우치베이스디자인독("맥주", "맥주")]
public 클래스 맥주
{
public 문자열 Id { get; set; }

[제이슨 프로퍼티("name")]
[카우치베이스뷰키("BY_ABV_AND_NAME", "name", 1)]
[카우치베이스뷰키("by_name", "name")]
public 문자열 이름 { get; set; }

[제이슨 프로퍼티("설명")]
public 문자열 설명 { get; set; }

[제이슨 프로퍼티("abv")]
[카우치베이스뷰키("BY_ABV_AND_NAME", "abv", 0)]
public float ABV { get; set; }

[제이슨 프로퍼티("breweryId")]
[카우치베이스뷰키("by_brewery", "breweryId")]
public 문자열 양조장 { get; set; }
}

그리고 카우치베이스디자인독 속성이 모델 클래스에 설정되어 있습니다. 이 클래스는 일반-CLR-객체(POCO)를 사용하여 디자인 문서를 정의합니다. name 인수를 생략하면 클래스와 동일한 이름(소문자)의 디자인 문서가 생성됩니다. type 인수를 생략하면 뷰는 문서에 클래스 이름(소문자)의 값을 가진 유형 속성이 있는지 확인합니다.

그리고 카우치베이스뷰키 속성은 인덱싱해야 하는 POCO 클래스의 프로퍼티에 설정됩니다. 예를 들어 맥주 위의 클래스에는 카우치베이스뷰키 속성에 "by_name" 및 "name" 인수를 추가합니다. 이러한 값으로 인해 생성되는 보기는 다음과 같습니다:

함수(doc, 메타) {
만약 (doc.유형 == "맥주" && doc.이름) {
emit(doc.이름, null);
}
}

"by_name" 인수는 이 뷰의 이름이고 "name" 인수는 어떤 속성이 있는지 확인하고 출력할지 정의합니다.

여러 프로퍼티를 다음과 같이 장식하여 복합 키를 포함할 수도 있습니다. 카우치베이스뷰키 속성에 뷰 이름 매개 변수에 대해 동일한 값을 포함하는 속성을 추가할 수 있습니다. 복합 키는 ABV 및 Name 속성에서 "by_abv_and_name"을 사용하여 시연합니다. 또한 속성이 방출되는 순서를 설정할 수 있는 선택적 순서 매개변수가 있다는 점도 주목하세요.

함수(문서, 메타) {
만약 (doc.유형 == "맥주" && doc.abv && doc.이름) {
emit([doc.abv, 문서.이름], null);
}
}

클래스를 적절한 속성으로 꾸미고 나면 카우치베이스 모델 뷰 생성기 프로젝트를 사용하여 뷰 생성기를 통해 모델을 실행할 수 있습니다. 이 프로젝트는 뷰를 만드는 데 사용할 모델이 포함된 모든 어셈블리를 나열하는 섹션이 있는 app.config가 필요한 간단한 명령줄 프로젝트입니다.

<섹션그룹 이름="modelViews">
<섹션 이름="어셈블리" 유형="System.Configuration.DictionarySectionHandler"/>
>

<modelViews>
<어셈블리>
<add ="데모 모델" ="CouchbaseModelViews.DemoModels" />
>
>

또한 다음을 구성해야 합니다. 카우치베이스클러스터카우치베이스클러스터 인스턴스가 기존과 동일한 구성(코드 또는 app.config)을 사용하여 생성되고 있습니다. 카우치베이스클라이언트. 그러나 이제 관리자 자격 증명을 제공하기 위해 설정할 수 있는 두 가지 속성이 추가로 있습니다.

<couchbase>
<서버 버킷="default" 버킷 비밀번호=“” 사용자 이름="관리자" 비밀번호="쿼티">
<add uri="https://localhost:8091/pools" />
>
>

app.config를 설정한 후에는 나열된 어셈블리를 로드할 수 있는 bin 디렉터리에 있는지 확인하세요. 물론 이러한 검색 기능을 달성하는 가장 쉬운 방법은 참조하는 것입니다. 그러나 콘솔 앱의 컴파일된 버전만 사용하려는 경우에는 해당 어셈블리를 bin 디렉터리에 복사하기만 하면 됩니다.

프레임워크가 실행되면 다음과 같은 "맥주" 디자인 문서가 생성됩니다:

{
"views": {
"BY_ABV_AND_NAME": {
"지도": "function(doc, meta) { rnt if (doc.type == 맥주 && doc.abv && doc.name) { rntt emit([doc.abv, doc.name], null); rnt } rn }”
},
"by_name": {
"지도": "function(doc, meta) { rnt if (doc.type == 맥주 && doc.name) { rntt emit(doc.name, null); rnt } rn }”
},
"by_brewery": {
"지도": "function(doc, meta) { rnt if (doc.type == 맥주 && doc.breweryId) { rntt emit(doc.breweryId, null); rnt } rn }”
}
}
}

콘솔에는 실제 뷰 생성 로직이 포함되어 있지 않습니다. 단지 내부의 다양한 배관 구성 요소에 대한 호출을 조율할 뿐입니다. 프레임워크 프로젝트에 추가합니다. Global.asax 또는 다른 앱 시작 이벤트에 뷰 생성을 포함하려는 경우 이러한 호출을 직접 수행하면 됩니다. 프레임워크에는 네 가지 주요 구성 요소가 있습니다.

  • 그리고 컨피그파서 는 구성 섹션에서 어셈블리 목록을 읽고 열거 가능한 어셈블리 목록을 생성하기만 하면 됩니다.
  • 그리고 뷰빌더 클래스는 어셈블리 또는 열거 가능한 어셈블리 목록을 취하고 각 유형을 반복합니다. 발견된 각 유형에 대해 카우치베이스디자인독 속성을 사용하면 뷰가 구성됩니다. 뷰의 빌드 메서드의 뷰빌더 는 키는 디자인 문서 이름이고 값은 실제 디자인 문서인 사전을 반환합니다.
  • 그리고 DesignDocManager 는 문서 이름과 함께 사전을 가져와서 문서 쌍을 디자인하고 카우치베이스클러스터 를 사용하여 디자인 문서를 만들 수 있습니다.
  • 또한 ViewRunner 클래스에서 새로 만든 보기를 실행합니다.
var 어셈블리 = 컨피그파서.어셈블리 가져오기();
변수 빌더 = new 뷰빌더();
빌더.어셈블리 추가(어셈블리.ToList());
var designDocs = 빌더.빌드();
var ddManager = new DesignDocManager();
ddManager.만들기(디자인 문서, (s) => 콘솔.WriteLine("{0} 디자인 문서 생성", s));
var runner = new ViewRunner();
runner.실행(디자인 문서, (k, v, s) => 콘솔.WriteLine("[{0}::{1}] 키 {2}", k, v, s["key"]), 5);

이 세 가지 구성 요소 중 두 가지를 결합하지 않고 원하는 대로 사용할 수 있습니다. 예를 들어 자체 조립 수집 시설이 있는 경우 이를 ViewBuilder.Build 을 사용하여 뷰를 만드는 데 필요한 JSON을 렌더링합니다.

이 시점에서 프레임워크는 대부분 완성되었고 합리적으로 테스트되었습니다. 코드에 원하는 것보다 루프가 몇 개 더 있고 튜플 을 과도하게 사용했을 수도 있지만 작동합니다. 프로젝트에 자유롭게 사용하세요. 이 코드는 Couchbase Labs 프로젝트이며 공식적으로 지원되지 않는다는 점에 유의하세요. 또한 베타 버전의 .NET Couchbase 클라이언트 라이브러리를 사용하고 있으며 API는 변경될 수 있다는 점도 기억하세요.

이 문서 공유하기
받은 편지함에서 카우치베이스 블로그 업데이트 받기
이 필드는 필수 입력 사항입니다.

작성자

게시자 존 자블로키

존 자블로키는 NET. SDK 개발자입니다. John은 Beantown ALT.NET의 주최자이자 Fairfield University의 전 겸임교수이기도 합니다. Amazon에서 Couchbase Server를 설치하고 구성하는 방법을 설명하는 "Couchbase Essentials"라는 책을 확인할 수도 있습니다.

댓글 하나

  1. 여기서 개념을 이해하지 못합니다. 새 보기(카우치베이스 디자인 문서)를 카우치베이스에 저장하려면 어떻게 해야 하나요?

    1. 안녕하세요, 샘

      새 뷰는 아래 코드를 실행하면 저장됩니다(위에서부터). 기본적으로 뷰 빌더에 새로운 Couchbase 속성으로 표시된 클래스가 포함된 어셈블리를 전달하기만 하면 됩니다. DesignDocManager에서 Create를 호출하면 뷰가 생성됩니다.

      var assemblies = ConfigParser.GetAssemblies();

      var builder = 새 뷰빌더();

      빌더.추가 어셈블리(어셈블리.ToList());

      var designDocs = builder.Build();

      var ddManager = 새로운 디자인도큐매니저();

      ddManager.Create(designDocs);

      1. 카우치베이스 서버에 연결하여 이 디자인 문서를 저장하는 것은 어떨까요? 그게 제가 헷갈리는 부분입니다... 이걸 카우치베이스 서버에 저장해야 하지 않을까요?

        1. Ddmanager가 뷰를 카우치베이스에 저장하나요? 내가 이해하지 못하는 것은. 이 코드가 DB와 어떤 관계가 있나요? 뷰는 어떻게 그리고 어디에 버킷에 저장되나요?

          1. 디자인 문서를 저장하는 동안 구성 파일을 사용하는 대신 코드를 통해 연결 및 클라이언트 객체 인스턴스를 전달할 수 있는 방법이 있나요?

          2. 도와주시면 감사하겠습니다. 다음과 같이 코드를 시도해 보았습니다:

            objAssemblies.Add(System.Reflection.Assembly.GetAssembly(typeof(myclass))); //myclass는 어트리뷰트로 장식된 모든 프로퍼티를 가지고 있습니다.

            빌더.추가 어셈블리(객체 어셈블리);

            var designDocs = builder.Build();

            var ddManager = 새로운 디자인도큐매니저();

            ddManager.Create(designDocs);

            하지만 작동하지 않습니다.

  2. GetView를 사용할 수 있기를 원합니다. 항상 404가 나옵니다. 내 모든 모델 클래스를 CouchbaseDesignDoc으로 표시하고 카우치베이스에 저장하려고 시도했지만 GetView를 사용하면 작동하지 않는 것 같습니다... 도와주세요...

    1. 안녕하세요 Matt,

      위의 뷰 빌더/디자인 문서 관리자 코드 조각을 실행한 후 서버에 뷰가 생성되었는지 확인하셨나요?

      - John

  3. 오늘 오후에 Google 행아웃에서 이 프로젝트를 시연할 예정입니다(자세한 내용은 Google+에서 Couchbase를 팔로우하세요). 나중에 여기에 링크를 게시하겠습니다.

  4. 좋지만 어트리뷰션 기반 디자인 문서 대신 FluentNHibernate와 유사하게 문서를 '유창하게' 디자인하는 방법도 있었으면 좋겠습니다.

댓글 남기기

카우치베이스 카펠라를 시작할 준비가 되셨나요?

구축 시작

개발자 포털에서 NoSQL을 살펴보고, 리소스를 찾아보고, 튜토리얼을 시작하세요.

카펠라 무료 사용

클릭 몇 번으로 Couchbase를 직접 체험해 보세요. Capella DBaaS는 가장 쉽고 빠르게 시작할 수 있는 방법입니다.

연락하기

카우치베이스 제품에 대해 자세히 알고 싶으신가요? 저희가 도와드리겠습니다.