در این پست از وبسایت پرووید در رابطه با ارتباط اپلیکیشن Xamarin Forms و ASP.NET Core Web API #2 صحبت خواهیم کرد. Xamarin Forms تکنولوژی مایکروسافت برای ساخت برنامه های cross-platform است.

در قسمت قبلی از آموزش در رابطه با ساخت یک native mobile app صحبت کردیم.

ساخت پروژه ی ASP.NET Core

به منظور ساخت پروژه ی ASP.NET ای که قرار است در این آموزش از آن استفاده کنیم، در ویژوال استادیو با یک ASP.NET Core Web Application بسازید و در پنچره ی دوم شبیه تصویر زیر Web API را و No Authentication را انتخاب کنید. نام پروژه را ToDoApi بگذارید.

از شما دعوت می کنیم که از بسته ی آموزش ویدئویی ساخت Web API در ASP.NET Core 2.0 و همچنین بسته ی آموزش ویدئویی شروع به کار برنامه نویسی ASP.NET Core که پیشتر بر روی وبسایت پرووید قرار گرفته اند استفاده کنید. برنامه ی ما باید بتواند به تمامی request هایی که به پورت 5000 وارد می شوند پاسخ بدهد، بنابراین در فایل Program.cs دستور UseUrls را شبیه به کد زیر وارد کنید.

var host = new WebHostBuilder()
    .UseKestrel()
    .UseUrls("http://*:5000")
    .UseContentRoot(Directory.GetCurrentDirectory())
    .UseIISIntegration()
    .UseStartup<Startup>()
    .Build();

نکته ی بسیار مهمی که نباید فراموش کرد این است که در زمان اجرا کردن برنامه باید آن را به صورت مستقیم اجرا کنید و نه از طریق IIS Express، چرا که در این صورت request های local در نظر گرفته نخواهند شد. برای اینکه برنامه را به صورت مستقیم اجرا کنید می توانید از دستور detnet run در command prompt استفاده کنید. علاوه بر این، می توانید از قسمت Debug Target در toolbar ویژوال استادیو نام برنامه را انتخاب کنید.

اضافه کردن model برنامه

کلاسی که به عنوان model برنامه عمل می کند ToDoItem نام دارد. کد مربوط به این کلاس در قسمت زیر نشان داده شده است.

using System.ComponentModel.DataAnnotations;

namespace ToDoApi.Models
{
    public class ToDoItem
    {
        [Required]
        public string ID { get; set; }

        [Required]
        public string Name { get; set; }

        [Required]
        public string Notes { get; set; }

        public bool Done { get; set; }
    }
}

لطفا به attribute های [Required] که بر روی property ها لحاظ شده اند دقت کنید. در رابطه با data annotation ها در بسته ی آموزش ویدئویی ساخت Web API در ASP.NET Core 2.0 از وبسایت پرووید صحبت کرده ایم. از آنجایی که متدهای Web API باید بتوانند به طریقی با داده ها کار کنند ازیک interface با نام IToDoRepository که در برنامه ی Xamarin اصلی قرار داده شده است استفاده می کنیم. پیشنهاد می کنیم آموزش رایگان انتخاب راهبردهای ساخت برنامه های موبایل با Xamarin را استفاده کنید. کد مربوط به این interface در قسمت پایین آمده است.

using System.Collections.Generic;
using ToDoApi.Models;

namespace ToDoApi.Interfaces
{
    public interface IToDoRepository
    {
        bool DoesItemExist(string id);
        IEnumerable<ToDoItem> All { get; }
        ToDoItem Find(string id);
        void Insert(ToDoItem item);
        void Update(ToDoItem item);
        void Delete(string id);
    }
}

به منظور پیاده سازی این interface کلاسی با نام ToDoRepository را تعریف می کنیم. کد مربوط به این کلاس در قسمت زیر مشاهده می شود.

using System.Collections.Generic;
using System.Linq;
using ToDoApi.Interfaces;
using ToDoApi.Models;

namespace ToDoApi.Services
{
    public class ToDoRepository : IToDoRepository
    {
        private List<ToDoItem> _toDoList;

        public ToDoRepository()
        {
            InitializeData();
        }

        public IEnumerable<ToDoItem> All
        {
            get { return _toDoList; }
        }

        public bool DoesItemExist(string id)
        {
            return _toDoList.Any(item => item.ID == id);
        }

        public ToDoItem Find(string id)
        {
            return _toDoList.FirstOrDefault(item => item.ID == id);
        }

        public void Insert(ToDoItem item)
        {
            _toDoList.Add(item);
        }

        public void Update(ToDoItem item)
        {
            var todoItem = this.Find(item.ID);
            var index = _toDoList.IndexOf(todoItem);
            _toDoList.RemoveAt(index);
            _toDoList.Insert(index, item);
        }

        public void Delete(string id)
        {
            _toDoList.Remove(this.Find(id));
        }

        private void InitializeData()
        {
            _toDoList = new List<ToDoItem>();

            var todoItem1 = new ToDoItem
            {
                ID = "6bb8a868-dba1-4f1a-93b7-24ebce87e243",
                Name = "Learn app development",
                Notes = "Attend Xamarin University",
                Done = true
            };

            var todoItem2 = new ToDoItem
            {
                ID = "b94afb54-a1cb-4313-8af3-b7511551b33b",
                Name = "Develop apps",
                Notes = "Use Xamarin Studio/Visual Studio",
                Done = false
            };

            var todoItem3 = new ToDoItem
            {
                ID = "ecfa6f80-3671-4911-aabe-63cc442c1ecf",
                Name = "Publish apps",
                Notes = "All app stores",
                Done = false,
            };

            _toDoList.Add(todoItem1);
            _toDoList.Add(todoItem2);
            _toDoList.Add(todoItem3);
        }
    }
}

توصیه میکنیم از بسته ی آموزش ویدئویی اینترفیس ها در سی شارپ استفاده کنید. علاوه بر این، در بسته ی آموزش ویدئویی pattern های کاربردی در Core Entity Framework در مورد repository صحبت کرده ایم.

در در حال حاضر data store برنامه یک collection از ToDoItem ها می باشد که به صورت private در این repository تعریف شده است. در ادامه نیاز به انجام پیکربندی dependency های برنامه در فایل Startup.cs داریم.

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc();

    services.AddSingleton<IToDoRepository,ToDoRepository>();
}

همانطور که در کد بالا مشاهده می کنید IToDoRepository که یک dependency است به ToDoRepository که یک کلاسی است که این اینترفیس را پیاده سازی کرده است resolve می شود. در مورد dependency injection و inversion of control در بسته ی آموزش ویدئویی Inversion of Control و IoC Container ها از وبسایت پرووید صحبت کرده ایم.

ساختن Controller

به منظور ساختن controller برنامه یک فایل با نام ToDoItemsController را اضافه کنید. شاید بدانید که controller ها باید از کلاس Microsoft.AspNetCore.Mvc.Controller ارث بری کنند. در رابطه با مباحث مربوط به Web API در ASP.NET Core پیش از این آموزش هایی به صورت رایگان در وبسایت پرووید منتشر شده است. از attribute ای با نام [Route] به منظور پیکربندی route ها استفاده می کنیم. در واقع می خواهیم برنامه بتوانید تمامی request هایی که به آدرسی با پیشوند api/todoitems وارد می شوند را هندل کند. کد زیر را مشاهده کنید.

using System;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using ToDoApi.Interfaces;
using ToDoApi.Models;

namespace ToDoApi.Controllers
{
    [Route("api/[controller]")]
    public class ToDoItemsController : Controller
    {
        private readonly IToDoRepository _toDoRepository;

        public ToDoItemsController(IToDoRepository toDoRepository)
        {
            _toDoRepository = toDoRepository;
        }
    }
}	

در این کد و در [Route] یک token با نام [controller] قرار دارد که با نام controller مورد نظر جایگزین خواهد شد و البته پسوند Controller که باید در پایان نام هر controller ای قرار بگیرد نیز حذف می شود. در رابطه با routing در ASP.NET Web API پیش از این یک آموزش رایگان بر روی سایت منتشر شده است.

خب همانطور که در کد بالا مشاهده می کنید controller مورد نظر یک وابستگی به IToDoRepository دارد که به عنوان پارامتر ورودی تابع سازنده و در قالب یک dependency آن را دریافت می کند. این موضوع به صورت خودکار توسط IoC container ای که در ASP.NET Core قرار گرفته است انجام می شود. اگر در رابطه با dependency injection اطلاعات بیشتری می خواهید به بسته ی آموزش ویدئویی Inversion of Control وبسایت پرووید رجوع کنید.

این API از چهار عمل اصلی CRUD پشتیبانی می کند و می تواند با انواع مختلفی از HTTP verb ها کار کند. ساده ترین کاری که این API انجام می دهد خواندن داده ها با استفاده از HTTP GET می باشد. در رابطه با انواع HTTP Verb ها در بسته ی آموزش ویدئویی ساخت Web API در ASP.NET Core 2.0 صحبت کرده ایم.

در قسمت بعدی از آموزش در رابطه با خواندن ایتم ها صحبت خواهیم کرد.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *