C#,,를 사용하여 마이크로서비스를 구축합니다.NET Core 및 MongoDB - 섹션 1

하면, 만약, 만약...🇪🇸, 내 블로그 보기:
The Developer's Dungeon
여보게, 동료들아!요즘 어때요?최근 몇 주 동안 나는 줄곧 C 개발자 직위의 면접 과정을 진행하고 있다.
나는 asp를 사용한다.이것은 내가 집에 있을 때 C 언어를 나의 훈련 언어로 선택하지 않는다는 것을 의미한다.그래서 제가 Github에서 사용한 C# 코드는 상당히 오래되어 제 경력 초기에 속했습니다.
그래서 저는 고용주가 저에게 준 인코딩 도전을 이용하여 저의 Github를 위해 업데이트된 C 코드를 만들고 좋은 안내서를 만들기로 했습니다. 당신은 그것을 따라 개인의 발전을 향상시킬 수 있습니다.

본 강좌에서 무엇을 얻을 수 있습니까?


이 시리즈의 마지막 부분에서 우리는 다음과 같은 특징을 가진 마이크로서비스를 제공할 것이다.
  • 통합MongoDB
  • 명확한 관심사 분리를 가진 계층 구조
  • API 파일
  • Docker 배포 지원
  • 유닛 테스트
  • 소개


    우리는 작은 장사가 하나 있는데, 우리는 판다💻. 새 컴퓨터 한 대를 판매할 때마다 우리는 주문서의 금액을 기록하고 그것을 구매하는 고객을 필요로 한다.
    우리는 MongoDB에 연결된 소형 마이크로서비스를 만들어서 주문서를 만들거나 읽거나 업데이트하거나 삭제할 수 있고 사용자 지출에 대한 추가 계산을 얻을 수 있습니다.
    DellOrder 모델은 다음과 같습니다.
    {
      "id": "guid",
      "userId": "guid",
      "amount": "int"
    }
    

    기본 정의


    먼저 ASP를 생성합니다.API 템플릿이 있는 NET Core 3.1 웹 응용 프로그램과 Visual Studio 2019에서 Docker 지원을 사용합니다.

    생성되면 API를 켜면 사용할 기본 템플릿을 표시하는 모델과 컨트롤러WeatherForecast가 표시됩니다.

    기본 코드를 삭제하면 모델과 기본 Orders Controller를 먼저 만듭니다.우리는 Get and Post 단점부터 시작할 것이다. 이렇게 하면 우리는 주문서를 추가하고 얻는 것을 테스트할 수 있다.
        [Route("v1/[controller]")]
        [ApiController]
        public class OrdersController : ControllerBase
        {
            /// <summary>
            /// Retrieves all orders
            /// </summary>
            /// <returns>a list with all the orders available</returns>
            [HttpGet]
            public async Task<IEnumerable<Order>> GetAll()
            {
                throw new NotImplementedException();
            }
    
            /// <summary>
            /// Retrieves the order that matches the id supplied
            /// </summary>
            /// <returns>one order model</returns>
            [HttpGet("{orderId}")]
            public async Task<ActionResult<Order>> Get(Guid orderId)
            {
                throw new NotImplementedException();
            }
    
            /// <summary>
            /// Creates a new order
            /// </summary>
            /// <returns>the newly created order</returns>
            [HttpPost]
            public async Task<ActionResult<Order>> Post([FromBody]OrderCreateUpdate orderRequest)
            {
                throw new NotImplementedException();
            }
        }
    
    앞의 코드에서 우리는 GetAll, Get, Post 단점을 만들었고, 우리는 공공 API의 주석도 포함했다. 우리는 이미 단점에서 v1/[controller] 이름을 사용하여 API를 버전 제어했다.만약 당신이 알아차렸다면, 당신은 이미 Post 우리가 아직 정의하지 않은 모델 OrderCreateUpdate 이 있다는 것을 알아차렸을 것이다.
    데이터베이스에 항목을 만들 때 OrderId 을 제공하지 마십시오. 순서가 존재하지 않기 때문에 API 모델을 독립적으로 변경할 수 있도록 둘로 나누는 것이 좋습니다.이것은 OrderCreateUpdate 모델입니다.
    {
      "userId": "guid",
      "amount": "int"
    }
    
            public Guid UserId { get; set; }
            public int Amount { get; set; }
    

    데이터베이스에 연결


    현재, 우리는 처음부터 데이터베이스를 만들거나 Docker를 어지럽히는 것이 아니라, MongoDBAtlas 제공된 온라인 데이터베이스를 사용할 것이다.
    프로젝트로 돌아가면 데이터베이스에 연결된 설정을 설정하는 방법을 찾아야 합니다. 우리는 Options Pattern 을 사용하여 이 점을 실현합니다.다음과 같은 구성을 정의했습니다.
        public class OrdersServiceOptions
        {
            public string DatabaseConnectionString { get; set; }
            public string DatabaseName { get; set; }
            public string CollectionName { get; set; }
        }
    
    현재 우리는 이미 설정을 준비했다. 우리는 첫 번째 Repository 를 계속 만들 수 있으며, 이것은 MongoDB 실례에 연결하는 것을 책임질 것이다.
    이것은 우리OrdersRepository의 코드입니다.
        public class OrdersRespository
        {
            private readonly IMongoDatabase database;
            private readonly IMongoCollection<Order> collection;
            private readonly ILogger<OrdersRespository> logger;
    
            public OrdersRespository(IOptions<OrdersProcessingServiceOptions> options, ILogger<OrdersRespository> logger)
            {
                if (options == null)
                {
                    throw new ArgumentNullException(nameof(options));
                }
    
                var configuration = options.Value;
                var client = new MongoClient(configuration.DatabaseConnectionString);
    
                this.database = client.GetDatabase(configuration.DatabaseName);
                this.collection = database.GetCollection<Order>(configuration.CollectionName);
                this.logger = logger;
            }
        }
    
    보시다시피, Repository 우리가 이전에 정의한 설정 옵션을 사용하여 MongoDB과의 연결을 만들고, 방법에서 사용할 기록기를 받아들입니다.다음은 가져오고 만드는 방법Orders을 만들 것입니다.
            public async Task<Order> GetOrder(Guid orderId) => await collection.Find(x => x.Id == orderId).FirstOrDefaultAsync();
    
            public async Task<IEnumerable<Order>> GetAll() => await collection.Find(_ => true).ToListAsync();
    
            public async Task<Order> CreateOrder(Order order)
            {
                try
                {
                    await collection.InsertOneAsync(order);
    
                    return order;
                }
                catch (Exception ex)
                {
                    logger.LogError(ex.Message, ex);
                    return null;
                }
            }
    
    이 세 가지 방법은 매우 간단하다. 우리는 id를 통해 주문서를 얻고, 모든 주문서를 얻고, 새로운 주문서를 만든다. (창설에 실패하면 적당한 로그 기록을 한다.)이 방법을 추가한 후에 우리는 이 저장소의 인터페이스를 만들었습니다. 그러면 우리는 첨부된 Dependency Injection 를 사용할 수 있습니다.순수한 핵심.
       public interface IOrdersRespository
        {
            Task<Order> GetOrder(Guid orderId);
            Task<IEnumerable<Order>> GetAll();
            Task<Order> CreateOrder(Order order);
        }
    

    부품 연결


    우리Controller로 돌아가서 우리Repository에게 적당한 전화를 하자.
        [ApiController]
        [Route("v1/[controller]")]
        public class OrdersController : ControllerBase
        {
            private readonly IOrdersRepository ordersRepository;
    
            public OrdersController(IOrdersRepository ordersRepository)
            {
                this.ordersRepository = ordersRepository;
            }
    
            /// <summary>
            /// Retrieves all orders
            /// </summary>
            /// <returns>a list with all the orders available</returns>
            [HttpGet]
            public async Task<IEnumerable<Order>> GetAll()
            {
                return await ordersRepository.GetAll();
            }
    
            /// <summary>
            /// Retrieves the order that matches the id supplied
            /// </summary>
            /// <returns>one order model</returns>
            [HttpGet("{orderId}")]
            [ProducesResponseType(StatusCodes.Status200OK)]
            [ProducesResponseType(StatusCodes.Status404NotFound)]
            public async Task<ActionResult<Order>> Get(Guid orderId)
            {
                var result = await ordersRepository.GetOrder(orderId);
    
                if (result == null) return NotFound();
    
                return Ok(result);
            }
    
            /// <summary>
            /// Creates a new order
            /// </summary>
            /// <returns>the newly created order</returns>
            [HttpPost]
            [ProducesResponseType(StatusCodes.Status201Created)]
            [ProducesResponseType(StatusCodes.Status400BadRequest)]
            public async Task<ActionResult<Order>> Post([FromBody]OrderCreateUpdate orderRequest)
            {
                var order = new Order()
                {
                    Amount = orderRequest.Amount,
                    UserId = orderRequest.UserId
                };
    
                var result = await ordersRepository.CreateOrder(order);
    
                if (result == null) return BadRequest();
    
                return StatusCode(201, result);
            }
        }
    
    우리는 구조 함수에 IOrdersRepository 의존항을 추가하고 단점에서 그것을 사용한다.또한 Repository의 결과에 따라 서로 다른 응답을 처리하고 ProducesResponseType 가능한 응답을 명확하게 정의합니다.

    오늘 결과?

    POST GET GET ALL
    만약 당신이 현대 API를 구축한 경험이 있다면, 당신은 깜짝 놀랄 것이다.이 녀석이 정말 API와 데이터베이스에 같은 모델을 사용할 수 있을까?그는 컨트롤러로부터 창고에 전화를 할 수 있습니까?왜 모든 것이 같은 항목에 있습니까?
    걱정하지 마세요. 저희는 이번 시리즈가 끝나기 전에 모든 것을 처리할 것입니다. 이것은 당신의 Github에 놓을 만한 물건이 될 것이라고 보증합니다.😄
    이것은 매우 많다. 나도 사용하는 모든 응용 프로그램 모델을 상세하게 소개하지 않았다. 왜냐하면 이것은 불가능하기 때문이다. 그러나 사용하는 모든 모델에는 ASP에서 어떻게 그것을 실현하는지를 가리키는 링크가 있다.NET 코어, 마이크로소프트 튜토리얼이 아주 좋아요. 부족한 디테일을 줄 거예요.
    나는 당신이 이 첫 번째 부분을 좋아하기를 바랍니다. 다음 부분에서 우리는 Update, Delete, 조합 정보 단점을 추가할 것입니다. 시간이 있으면 우리는 더욱 잘 관심사를 분리하고 우리의 서비스를 보완할 것입니다.
    예전과 같이, 만약 당신이 좋아하거나 좋아하지 않는다면, 평론에서 나에게 알려주고, 나와 공유해 주십시오😄

    좋은 웹페이지 즐겨찾기