نوشتن برنامه با WEB API و دیتابیس ORACLE و DAPPER

DAPPER

DAPPER ، این مقاله بر چگونگی ایجاد API وب سایت اصلی برای بدست آوردن داده‌ها از یک پایگاه‌داده اوراکل با استفاده از dapper ORM تمرکز خواهد کرد.

ما در این مقاله از دیتابیس ORACLE استفاده می کنیم چون در همه ی مقاله ها از sql server استفاده شده است برای کاهش پیچیدگی منطق دسترسی به پایگاه داده ما از dapper ORM استفاده می کنیم.

Dapper چیست؟

Dapper یک ORM کوچک، سبک و سریع می باشد که دارای محبوبیت زیادی است که وظیفه آن مدیریت ارتباط بین محیط برنامه نویسی و دیتابیس می باشد. شما با کمک Dappe می توانید به سادگی دستورات SQL خود را در قالب Stored Procedure و یا دستورات مستقیم SQL اجرا نمائید. Dapper کمک می کند قسمت هایی مانند مدیریت Connection ها، اجرا Command های SQL ای و همچنین تبدیل نتایج درخواست (Select Result) به ViewModel بسیار ساده و سریع انجام شود. در ادامه می خواهیم با نحوه کار Dapper به صورت مرحله به مرحله در یک پروژه آشنا شویم و در پایان  این مقاله شما بتوانید براحتی از Dapper استفاده نمایید.

یک پروژه asp.net web api core ایجاد نمایید.

یک پروژه ی جدید Asp,net core web api ایجاد نمایید با استفاده از نرم افزار visual studio 2017 نسخه ی ۱۵.۳ را باز نمایید.

  • در مرحله اول یک پروژه جدید ایجاد نمایید.
  • در مرحله ی بعدی نسخه framework را انتخاب نمایید و گزینه ی c# و سپس .net core را انتخاب نمایید.
  • در مرحله ی بعد باید .net core را انتخاب نمایید و ماکن پروژه را انتخاب کنید و بعد دکمه ی ok را انتخاب نمایید.
  • در مرحله ی بعدی یک پنجره برای شما باز می شود که از طریق آن می توانید web api را انتخاب نمایید.

بعد از چند دقیقه ی بعد پروژه ی شما از نوع web api ساخته می شود.

تنظیمات جدول oracle و Stored Procedures

برای ایجاد پایگاه داده و جداول ما از ORACLE استفاده می کنیم که انعطاف پذیر است و به ما کمک می کند پایگاه داده خوبی داشته باشیم.

توسعه دهنده ORACLE یک محیط یکپارچه است که برای مدیریت و توسعه ی جداول پایگاه داده از آن استفاده می شود.

توسعه دهنده SQL ، یک کاربرگ برای مدیریت پایگاه‌داده، یک console DBA برای مدیریت پایگاه‌داده، یک راهکار مدل‌سازی اطلاعات کامل، و یک پلت فرم مهاجرت برای حرکت پایگاه‌های داده سوم شما به Oracle ارائه می‌دهد.

یک دیتابیس به نام “TEST_DB” ایجاد نمایید و داخل آن یک جدول به نام “EMPLOYEE” ایجاد نمایید .

برای ایجاد جدول می توانید از کد های زیر استفاده نمایید.

 CREATE TABLE "TEST_DB"."EMPLOYEE"   
  (   
   "ID" NUMBER(10,0) GENERATED BY DEFAULT ON NULL AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 100 CACHE 20 NOORDER  NOCYCLE ,   
"NAME" VARCHAR2(255 BYTE),   
"SALARY" NUMBER(10,0),   
"ADDRESS" VARCHAR2(500 BYTE)  
  ) SEGMENT CREATION IMMEDIATE   
 PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255   
NOCOMPRESS LOGGING  
 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645  
 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1  
 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)  
 TABLESPACE "TEST_DATA" ;  

ما نیاز داریم که چند سطر به جدول مان اضافه کنیم به صورت زیر:

Insert into TEST_DB.EMPLOYEE (ID,NAME,SALARY,ADDRESS) values (100,'Mukesh',20000,'India');  
Insert into TEST_DB.EMPLOYEE (ID,NAME,SALARY,ADDRESS) values (101,'Rion',28000,'US');  
Insert into TEST_DB.EMPLOYEE (ID,NAME,SALARY,ADDRESS) values (102,'Mahesh',10000,'India');  
Insert into TEST_DB.EMPLOYEE (ID,NAME,SALARY,ADDRESS) values (103,'Banky',20000,'India'); 

حالا نیاز به ساختن یک preocedure برای سوابق کارمندان نیاز داریم که به صورت زیر نوشته می شود.

CREATE OR REPLACE PROCEDURE "TEST_DB"."USP_GETEMPLOYEES" (  
    EMPCURSOR OUT SYS_REFCURSOR  
)  
AS  
Begin  
Open EMPCURSOR For  
SELECT ID, NAME, SALARY,ADDRESS FROM Employee;  
End;  

حالا ما نیاز داریم که از اطلاعات جدول یک سری اطلاعات بدست آوریم.

برای این کار شما می توانید یک procedure ایجاد کنید که داخل آن procedure اطلاعات کارمندان را بر اساس شماره کارمندی شان می توانید بدست آورید.

CREATE OR REPLACE PROCEDURE "TEST_DB"."USP_GETEMPLOYEEDETAILS"   
(  
  EMP_ID IN INT,  
  EMP_DETAIL_CURSOR OUT SYS_REFCURSOR    
) AS   
BEGIN  
    OPEN EMP_DETAIL_CURSOR FOR  
    SELECT ID, NAME, SALARY,ADDRESS FROM Employee WHERE ID = EMP_ID;  
END;  

برای این که dapper را اضافه نمایید باید در قسمت console در پروژه ی خود این خط کد را ایجاد نمایید به صورت زیر:

Install-Package Dapper -Version 1.50.5

پس از نصب شما می توانید refrence برنامه ی خودتان را ببینید که در آن dapper اضافه شده است.

نصب Oracle Manage Data Access برای core

ما برای ایجاد پروژه ی خود به web api نیاز داریم که برای دسترسی به داده ها باید از دیتابیس oracle استفاده کنیم.

برنامه ی ORACLE به ما کمک می کند که منطق دسترسی به پایگاه داده را مدیریت کنیم بنابر این باید بسته ی زیر را که در نسخه ی بتا قرار دارد نصب کنیم.
Install-Package Oracle.ManagedDataAccess.Core -Version 2.12.0-beta2

افزودن oracle connection

برای دسترسی برنامه به دیتابیس ما نیاز داریم که از رشته ی ارتباطی زیر را در فایل مربوط به تنظیمات پروژه مانند تصویر زیر اضافه نماییم:


{  
  "Logging": {  
    "IncludeScopes": false,  
    "Debug": {  
      "LogLevel": {  
        "Default": "Warning"  
      }  
    },  
    "Console": {  
      "LogLevel": {  
        "Default": "Warning"  
      }  
    }  
  },  
  "ConnectionStrings": {  
    "EmployeeConnection": "data source=mukesh:1531;password=**********;user id=mukesh;Incr Pool Size=5;Decr Pool Size=2;"  
  }  
}  

ساخت Repositories

ما در این پروژه از repository استفاده می کنیم به این صورت که باید یک پوشه به نام ” Repositories ” ایجاد کنیم و داخل آن یک پروژه از نوع web api ایجاد نمایید.

یک interface به نام ” IEmployeeRepository ” و یک کلاس به نام ” EmployeeRepository ” ایجاد کنیم و داخل کلاس IEmployeeRepository . را پیاده سازی کنیم.

namespace Core2API.Repositories  
{  
    public interface IEmployeeRepository  
    {  
        object GetEmployeeList();  
  
        object GetEmployeeDetails(int empId);  
          
    }  
}  

در زیر کلاس EmployeeRepository وجود دارد که EmployeeRepository را اجرا می کند برای دسترسی به تنظیمات ما IConfiguration را اجرا می کنیم .

بنابر این ما یک شی داریم که آماده استفاده است .

علاوه بر این ما متد GetConnection را داریم که رشته ی اتصال را دریافت می کند و در نهایت اتصال را به OracleConnection را فراهم می کند ما “IEmployeeRepository” این را پیاده سازی کردیم.

در آن از دو متد GetEmployeeDetails و GetEmployeeList استفاده شده است.

using Core2API.Oracle;  
using Dapper;  
using Microsoft.Extensions.Configuration;  
using Oracle.ManagedDataAccess.Client;  
using System;  
using System.Data;  
  
  
namespace Core2API.Repositories  
{  
    public class EmployeeRepository : IEmployeeRepository  
    {  
        IConfiguration configuration;  
        public EmployeeRepository(IConfiguration _configuration)  
        {  
            configuration = _configuration;  
        }  
        public object GetEmployeeDetails(int empId)  
        {  
            object result = null;  
            try  
            {  
                var dyParam = new OracleDynamicParameters();  
                dyParam.Add("EMP_ID", OracleDbType.Int32, ParameterDirection.Input, empId);  
                dyParam.Add("EMP_DETAIL_CURSOR", OracleDbType.RefCursor, ParameterDirection.Output);  
  
                var conn = this.GetConnection();  
                if (conn.State == ConnectionState.Closed)  
                {  
                    conn.Open();  
                }  
  
                if (conn.State == ConnectionState.Open)  
                {  
                    var query = "USP_GETEMPLOYEEDETAILS";  
  
                    result = SqlMapper.Query(conn, query, param: dyParam, commandType: CommandType.StoredProcedure);  
                }  
            }  
            catch (Exception ex)  
            {  
                throw ex;  
            }  
  
            return result;  
        }  
  
        public object GetEmployeeList()  
        {  
            object result = null;  
            try  
            {  
                var dyParam = new OracleDynamicParameters();  
  
                dyParam.Add("EMPCURSOR", OracleDbType.RefCursor, ParameterDirection.Output);  
  
                var conn = this.GetConnection();  
                if(conn.State == ConnectionState.Closed)  
                {  
                    conn.Open();  
                }  
  
                if (conn.State == ConnectionState.Open)  
                {  
                    var query = "USP_GETEMPLOYEES";  
  
                    result = SqlMapper.Query(conn, query, param: dyParam, commandType: CommandType.StoredProcedure);  
                }  
            }  
            catch (Exception ex)  
            {  
                throw ex;  
            }  
  
            return result;  
        }  
  
        public IDbConnection GetConnection()  
        {  
            var connectionString = configuration.GetSection("ConnectionStrings").GetSection("EmployeeConnection").Value;  
            var conn = new OracleConnection(connectionString);             
            return conn;  
        }  
    }  
}  
   
public IDbConnection GetConnection()  
{  
     var connectionString = configuration.GetSection("ConnectionStrings").GetSection("EmployeeConnection").Value;  
     var conn = new OracleConnection(connectionString);             
     return conn;  
}  

ما در کد زیر از پارامترهای oracle استفاده می کنیم.

از کلاس OracleDyamicParameters استفاده می‌کنیم که فهرستی از توابع را برای مدیریت رفتار پارامترهای Oracle فراهم می‌کند.

  using Dapper;  
using Oracle.ManagedDataAccess.Client;  
using System.Collections.Generic;  
using System.Data;  
  
namespace Core2API.Oracle  
{  
    public class OracleDynamicParameters : SqlMapper.IDynamicParameters  
    {  
        private readonly DynamicParameters dynamicParameters = new DynamicParameters();  
        private readonly List<OracleParameter> oracleParameters = new List<OracleParameter>();  
  
        public void Add(string name, OracleDbType oracleDbType, ParameterDirection direction, object value = null, int? size = null)  
        {  
            OracleParameter oracleParameter;  
            if (size.HasValue)  
            {  
                oracleParameter = new OracleParameter(name, oracleDbType, size.Value, value, direction);  
            }  
            else  
            {  
                oracleParameter = new OracleParameter(name, oracleDbType, value, direction);  
            }  
  
            oracleParameters.Add(oracleParameter);  
        }  
  
        public void Add(string name, OracleDbType oracleDbType, ParameterDirection direction)  
        {  
            var oracleParameter = new OracleParameter(name, oracleDbType, direction);  
            oracleParameters.Add(oracleParameter);  
        }  
  
        public void AddParameters(IDbCommand command, SqlMapper.Identity identity)  
        {  
            ((SqlMapper.IDynamicParameters)dynamicParameters).AddParameters(command, identity);  
  
            var oracleCommand = command as OracleCommand;  
  
            if (oracleCommand != null)  
            {  
                oracleCommand.Parameters.AddRange(oracleParameters.ToArray());  
            }  
        }  
    }  
}       

برای دسترسی به وابستگی های موجود در کنترل کننده و یا کلاس مخزن باید از متدConfigureServices در کلاس startup استفاده کنیم

using Core2API.Repositories;  
using Microsoft.AspNetCore.Builder;  
using Microsoft.AspNetCore.Hosting;  
using Microsoft.Extensions.Configuration;  
using Microsoft.Extensions.DependencyInjection;  
  
namespace Core2API  
{  
    public class Startup  
    {  
        public Startup(IConfiguration configuration)  
        {  
            Configuration = configuration;  
        }  
  
        public IConfiguration Configuration { get; }  
  
        // This method gets called by the runtime. Use this method to add services to the container.  
        public void ConfigureServices(IServiceCollection services)  
        {  
            services.AddTransient<IEmployeeRepository, EmployeeRepository>();  
            services.AddSingleton<IConfiguration>(Configuration);  
            services.AddMvc();  
        }  
  
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.  
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)  
        {  
            if (env.IsDevelopment())  
            {  
                app.UseDeveloperExceptionPage();  
            }  
  
            app.UseMvc();  
        }  
    }  
}  

ما باید api را در controller خود صدا بزنیم اول از همه ما IEmployeeRepository را به همراه وابستگی ها اضافه می کنیم و دوما اینکه ما api را به همراه صفات route صدا می زنیم.

با استفاده از این دو متد مانند کد زیر:

  using Core2API.Repositories;  
using Microsoft.AspNetCore.Mvc;  
  
namespace CoreAPI.Controllers  
{  
    [Produces("application/json")]      
    public class EmployeeController : Controller  
    {  
        IEmployeeRepository employeeRepository;  
        public EmployeeController(IEmployeeRepository _employeeRepository)  
        {  
            employeeRepository = _employeeRepository;  
        }  
  
        [Route("api/GetEmployeeList")]  
        public ActionResult GetEmployeeList()  
        {  
            var result = employeeRepository.GetEmployeeList();  
            if (result == null)  
            {  
                return NotFound();  
            }  
            return Ok(result);              
        }  
  
        [Route("api/GetEmployeeDetails/{empId}")]  
        public ActionResult GetEmployeeDetails(int empId)  
        {  
            var result = employeeRepository.GetEmployeeDetails(empId);  
            if (result == null)  
            {  
                return NotFound();  
            }  
            return Ok(result);  
        }  
    }  
}  

حالا همه چیز برای تست آماده است اتصال به دیتابیس در اروکل و پارامترهای داخل controller آماده است .

حال شما می توانید دکمه ی F5 را فشار دهید و پارامترهای مورد نطر را در postman مشاهده کنید.

در postman شما باید آدرس را بزنید و بعد از آن با زدن دکمه ی enter به آدرس مورد نظر می رود و متد get را فراخوانی می کند و آن دو سطری که در ابتدا وارد کردید را نمایش می دهد.

DAPPER

زمانی که بعد از انتهای آدرس کد کارمند را می زنید به عنوان مثال ۱۰۳ را می توانید اطلاعات مربوط به شماره ی کارمند مورد نظر را در postman مشاهده کنید مانند تصویر زیر:

DAPPER

در آخر ما امروز یاد گرفتیم که چگونه یک پروژه با web api و اتصال با اوراکل را ببینید.


زهره سلطانیان

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.