의존성 주입은 코딩을 더 쉽게 만들어주는 디자인 패턴입니다. 복잡한 종속성이 있는 객체를 인스턴스화해야 하는 번거로움을 덜어주고 테스트를 더 쉽게 작성할 수 있게 해줍니다. 종속성 주입은 Couchbase.Extensions.DependencyInjection 라이브러리(GitHub)를 사용하면 ASP.NET Core 종속성 주입 프레임워크 내에서 Couchbase 클러스터 및 버킷을 사용할 수 있습니다.
지난 블로그 게시물에서 ASP.NET을 사용한 분산 캐싱에서 의존성 주입 라이브러리를 언급했습니다. 이 글에서 의존성 주입에 대해 자세히 살펴보겠습니다. 제가 만든 코드 샘플은 다음 링크에서 확인할 수 있습니다. GitHub.
Couchbase의 기본 설정
먼저 Couchbase Server 클러스터가 실행 중이어야 합니다. 가능합니다:
다음으로 다음을 수행해야 합니다. 버킷 만들기 를 추가합니다. 이 버킷은 Couchbase와 함께 제공되는 "여행용 샘플" 버킷이거나 직접 만든 버킷일 수 있습니다.
Couchbase Server 5.0을 사용하는 경우, 사용자도 만들어야 합니다. 이 사용자에게 클러스터 관리자 권한을 부여하고 버킷과 같은 이름을 지정하세요(쉽게 따라할 수 있도록 하기 위해).
Couchbase.Extensions를 사용한 종속성 주입
그리고 Couchbase.Extensions(GitHub) 프로젝트는 Couchbase Server 및 ASP.NET Core 작업을 더 간단하게 만드는 것을 목표로 합니다. 종속성 주입은 이러한 확장 기능 중 하나에 불과합니다.
NuGet을 사용하여 ASP.NET Core 프로젝트에 추가할 수 있습니다:
- 패키지 관리자를 사용합니다:
Install-Package Couchbase.Extensions.DependencyInjection -Version 1.0.2 - NuGet UI 사용
- .NET 명령줄을 사용합니다:
닷넷 Couchbase.Extensions.DependencyInjection 패키지 추가 --버전 1.0.2
(작성 시점의 최신 버전은 1.0.2 버전입니다).

다음으로, 다음 사항을 변경해야 합니다. 시작 클래스의 Startup.cs.
캐싱에 관한 블로그 게시물에서 구성을 하드코딩했습니다:
|
1 2 3 4 5 |
서비스.카우치베이스 추가(클라이언트 => { 클라이언트.서버 = new 목록<Uri> { new Uri("http://localhost:8091")}; 클라이언트.UseSsl = false; }); |
데모와 블로그 게시물에는 괜찮지만 프로덕션 프로젝트에는 구성 파일을 사용하고 싶을 것입니다.
|
1 |
서비스.카우치베이스 추가(구성.섹션 가져오기("Couchbase")); |
기본값을 사용한다고 가정할 때 appsettings.json를 클릭하고 해당 파일을 업데이트하여 Couchbase 섹션을 추가합니다:
|
1 2 3 4 5 6 |
"Couchbase" : { "서버": [ "http://localhost:8091" ], "UseSsl": false } |
"카우치베이스" 섹션을 만들면 종속성 주입 모듈이 앱설정.json 텍스트 파일에서 바로 읽습니다.
생성자 주입
의존성 주입이 설정되면 클래스에 유용한 객체를 주입할 수 있습니다. 컨트롤러, 서비스 또는 리포지토리에 객체를 주입할 수 있습니다.
다음은 다음에 주입하는 예제입니다. 홈컨트롤러:
|
1 2 3 4 5 6 7 8 9 10 11 |
public 클래스 홈컨트롤러 : 컨트롤러 { 비공개 읽기 전용 IBucket _버킷; public 홈컨트롤러(IBucketProvider 버킷 공급자) { _버킷 = 버킷 공급자.GetBucket("travel-sample", "비밀번호"); } // ... snip ... } |
다음으로, 간단한 Get 작업을 "travel-sample"의 잘 알려진 문서에서 수행합니다. 이 토큰을 사용하면 Couchbase .NET SDK의 종속성 주입이 작동하는 모습을 볼 수 있습니다. 생성된 문서를 변경하겠습니다. 정보 액션 메서드를 사용합니다. 이 방법에서는 경로 문서를 검색하여 장비 번호를 기록합니다.
|
1 2 3 4 5 6 7 8 9 10 |
public IActionResult 정보() { // 콜럼버스-시카고(유나이티드) 경로 문서 가져오기 var 경로 = _버킷.Get<동적>("route_56027").가치; // 경로의 장비 번호 표시 데이터 보기["메시지"] = "CMH에서 ORD로 - " + 경로.장비; 반환 보기(); } |
그 결과는 다음과 같습니다:

성공! 종속성 주입이 성공했고 이제 Couchbase 버킷을 사용할 준비가 되었습니다.
'여행용 샘플'을 사용하지 않는 경우에는 자신의 버킷에 있는 키를 사용하세요.
이름 지정된 버킷
매번 이름을 지정할 필요 없이 하나의 버킷에 종속성 주입을 사용할 수 있습니다.
먼저 다음을 구현하는 인터페이스를 생성하여 시작하십시오. INamedBucketProvider. 비워 둡니다. 다음은 예시입니다:
|
1 2 3 4 |
public 인터페이스 ITravel샘플버킷제공자 : INamedBucketProvider { // 여기에는 아무것도 들어가지 않습니다! } |
그런 다음 Startup.cs에서 다음을 사용하여 이 인터페이스를 버킷에 매핑합니다. 카우치베이스버킷 추가:
|
1 2 3 |
서비스 .카우치베이스 추가(구성.섹션 가져오기("Couchbase")) .카우치베이스버킷 추가<ITravel샘플버킷제공자>("travel-sample", "비밀번호"); |
이제 ITravel샘플버킷제공자 가 일반적인 공급자 대신 주입됩니다.
|
1 2 3 4 |
public 홈컨트롤러(ITravel샘플버킷제공자 여행 버킷 공급자) { _버킷 = 여행 버킷 공급자.GetBucket(); } |
더 복잡한 종속성 주입
지금까지는 컨트롤러에만 의존성 주입을 사용했습니다. 종속성 주입은 더 복잡하고 심층적인 객체 그래프에서 효과를 발휘하기 시작합니다.
예를 들어 Couchbase 버킷을 사용하지만 이메일 서비스도 사용하는 서비스 클래스를 상상해 보세요.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public 클래스 복잡한 서비스 : IComplexService { 비공개 읽기 전용 IBucket _버킷; 비공개 읽기 전용 IEmailService _email; public 복잡한 서비스(ITravel샘플버킷제공자 버킷 공급자, IEmailService 이메일 서비스) { _버킷 = 버킷 공급자.GetBucket(); _email = 이메일 서비스; } public void 승인신청(문자열 이메일주소) { _버킷.Upsert(이메일주소, new {이메일주소, 승인됨 = true}); _email.SendEmail(이메일주소, "승인됨", "신청이 승인되었습니다!"); } } |
다음으로 컨트롤러에서 이 서비스를 사용해 보겠습니다(일명 종속성으로 만들기). 하지만 컨트롤러가 버킷이나 이메일 서비스를 직접 사용하지 않는다는 점에 유의하세요.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public 클래스 ApproveController : 컨트롤러 { 비공개 읽기 전용 IComplexService _svc; public ApproveController(IComplexService svc) { _svc = svc; } public IActionResult 색인() { var 가짜 이메일 주소 = Faker.인터넷.이메일(); _svc.승인신청(가짜 이메일 주소); 데이터 보기["메시지"] = "승인됨'" + 가짜 이메일 주소 + "'"; 반환 보기(); } } |
내가 인스턴스화한다면 복잡한 서비스 를 수동으로 인스턴스화하려면 적어도 두 개의 다른 객체를 인스턴스화해야 합니다. 다음과 같이 보일 것입니다: 새로운 ComplexService(새로운 버킷제공자(), 새로운 MyEmail서비스(). 추적해야 할 종속성이 많아서 종속성이 변경되면 수동으로 유지 관리해야 하는 일이 많아요.
대신 ASP.NET Core에서 종속성 주입을 사용하여 이 모든 작업을 수행하도록 할 수 있습니다. 다시 시작:
|
1 2 |
서비스.AddTransient<IEmailService, 내 이메일 서비스>(); 서비스.AddTransient<IComplexService, 복잡한 서비스>(); |
이제 ASP.NET Core는 인스턴스화 방법을 알고 있습니다:
ITravel샘플버킷제공자Couchbase.Extensions.DependencyInjection 덕분입니다.IEmailService- 다음을 사용하라고 했습니다.내 이메일 서비스IComplexService- 다음을 사용하라고 했습니다.복잡한 서비스
마지막으로, 언제 ApproveController 가 인스턴스화되면 ASP.NET Core가 이를 수행하는 방법을 알 수 있습니다. 그러면 복잡한 서비스 인스턴스화하여 내 이메일 서비스 그리고 복잡한 서비스. 주입됩니다. 복잡한 서비스 를 `ApproveController'의 생성자에 자동으로 추가합니다. 최종 결과입니다:

전체 예제를 확인하려면 이 블로그 게시물과 함께 제공되는 소스 코드가 깃허브에 있습니다..
정리
스스로 정리하는 것을 잊지 마세요. ASP.NET Core 애플리케이션이 중지되면 Couchbase .NET SDK가 사용 중인 모든 리소스를 해제하세요. 리소스를 구성 메서드에 다음과 같은 유형의 매개변수를 추가합니다. 애플리케이션 수명:
|
1 |
public void 구성(애플리케이션 빌더 앱, I호스팅환경 환경, ILoggerFactory loggerFactory, 애플리케이션 수명 애플리케이션평생) |
그 안에서 구성 메서드를 설정하고 응용 프로그램 중지 이벤트:
|
1 2 3 4 |
애플리케이션평생.응용 프로그램 중지.등록하기(() => { 앱.애플리케이션 서비스.GetRequiredService<ICouchbaseLifetimeService>().닫기(); }); |
요약
의존성 주입은 풍부한 주제입니다. 종속성 주입과 애플리케이션에 대한 이점에 관한 책이 여러 권 출간되었습니다. 이 블로그 게시물은 표면적인 부분만 다루고 있으며 테스트 가능성 이점에 대해서는 다루지 않았습니다.
Couchbase.Extensions.DependencyInjection을 사용하면 Couchbase를 ASP.NET Core에 더 쉽게 주입할 수 있습니다.
궁금한 점이 있거나 의견이 있으시면 GitHub 리포지토리 또는 카우치베이스 .NET SDK 포럼.
궁금한 점이 있으면 아래에 댓글을 남기거나 다음에서 저를 찾아주세요. 트위터 @mgroves.
를 설정하려고 할 때
ervices.AddCouchbase(Configuration.GetSection("Couchbase"));
설정을 사용하여 호출을 : Configuration.GetSection("Couchbase")))
은 null을 반환합니다.
그래서 이것은 문제가 되지 않습니다.
데이터가 정상적으로 전달되는 것 같지만 전화를 걸려고 하면:
bucketProvider.GetBucket("statistics", "");
"부츠 랩 예외"가 발생합니다.
아서, Couchbase .NET 포럼에 코드의 전체 보기와 함께 질문을 게시해 주시겠어요? https://www.couchbase.com/forums/c/net-sdk
안녕하세요 매튜, 리포지토리 코드를 업데이트해 주시겠어요? ASP.Net Core 2.2 프로젝트에서 사용하는 데 문제가 있습니다.
네, 라바비, 방금 리포지토리를 .NET Core 2.2로 업데이트했습니다. 실제로는 .NET Core 2.2에 문제가 없었을 가능성이 높습니다. 제 생각에는 인증 작동 방식이 변경된 Couchbase Server 5 이상을 사용 중이신 것 같습니다. (제가 본 유일한 .NET Core 문제는 .NET Core 1 이후 더 이상 사용되지 않는 loggerFactory가 있다는 것입니다.)
감사합니다 매튜, 작동합니다. 인증할 수는 있지만 데이터를 가져올 위치를 찾을 수 없나요? 여행 샘플이 이미 데이터베이스에 설치되어 있습니다.
여러분의 멋진 간단한 크러드 선물 목록 샘플을 본 적이 있기 때문에 이번에는 종속성 주입을 사용하여 비슷한 것을 볼 수 있기를 기대했습니다. 의존성 주입으로 어떻게 이런 크러드를 얻을 수 있을까요?
이 샘플이 모든 CRUD 작업을 다루고 있지 않다는 것은 맞지만, 참조하신 동영상을 만든 이후로 SDK는 크게 변경되지 않았습니다. 이 리포지토리에서 HomeController를 확인해보시면 여전히 IBucket 객체만 사용되고 있음을 알 수 있습니다. https://github.com/couchbaselabs/blog-source-code/blob/master/Groves/078AspNetCoreDependencyInjection/src/CouchbaseDIExample/CouchbaseDIExample/Controllers/HomeController.cs#L42
.net 코어 2.2, 종속성 주입, 크러드, Couchbase를 모두 함께 보여주는 동영상에 관심이 있으신가요?
그렇게까지 물어보진 않겠습니다 :) 기존 코드를 수정하는 것만으로도 위시리스트 데모에서 Rest API로 의존성 주입을 실행하는 것은 저에게도, 그리고 카우치베이스를 접하고 싶어하는 많은 .Net Core 개발자들에게 큰 도움이 될 것 같고, N1QL 입문용 위시리스트 코드 샘플은 카우치베이스를 .Net Core 개발자 커뮤니티에 더 널리 알리기 위한 매우 간단하고 간결한 시작점으로, 현재 샘플은 ComplexService, EmailService 등으로 조금 복잡해서 처음 시작하려는 분들에게는 적합하지 않은 것 같아요.
감사합니다, 좋은 피드백입니다. 한동안 '시작하기' ASP.NET 콘텐츠를 업데이트하지 않았는데, 때가 된 것 같습니다.
[…] https://www.couchbase.com/dependency-injection-aspnet-couchbase/ https://docs.couchbase.com/dotnet-sdk/current/hello-world/start-using-sdk.html […]
[…] https://www.couchbase.com/dependency-injection-aspnet-couchbase/ https://docs.couchbase.com/dotnet-sdk/current/hello-world/start-using-sdk.html […]