استفاده از diagnostic در asp.net mvc
شناسه پست: 1469
بازدید: 990

چکیده: استفاده از Diagnostic ها در ASP.NET MVC 6 (Core 1.0). در یک نمونه از اپلیکیشن خواهیم دید که چطور به آسانی میتوان به مشکلات کدنویسی پی برد.

نسخه ASP.NET Core 1.0 (همان RC1) چند feature جدید بعلاوه بهبودهایی بر روی feature های موجود ارائه داده است. یکی از این feature های خیلی مفید، Diagnostic ها هستند. ASP.NET Core موسوم به ASP.NET 5، کار عیب یابی را ساده میکند. در این مقاله، ما در موردویژگی Diagnostic ها صحبت خواهیم کرد و نحوه پیاده سازی آن را در یک اپلیکیشن ASP.NET MVC 6 خواهیم دید.

ASP.NET 5 به عنوان  ASP.NET Core 1.0 شناخته شده است. در نسخه ASP.NET Core 1.0، فریم ورک Web API با ASP.NET MVC ادغام شده است و به اسم MVC 6 نامیده میشود.

پیاده سازی Diagnostic ها در ASP.NET MVC 6

این اپلیکیشن با  Visual Studio 2015 و  ASP.NET Core 1.0 پیاده سازی شده است.

مرحله 1: ویژوال استودیو 2015 را باز کنید و یک ASP.NET Web Application جدید از پنجره Add New Project ایجاد کنید. ok را کلیک کنید و سپس از ASP.NET 5 Template ها، empty را انتخاب نمایید. سپس ok را بزنید و در نتیجه پروژه ایجاد خواهد شد.

مرحله 2: در این پروژه، فایل project.json را باز کنید و dependency های زیر را در قسمت dependencies وارد نمایید.

"Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
"Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-rc1-final",
"Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final",
"Microsoft.AspNet.Tooling.Razor": "1.0.0-rc1-final",
"Microsoft.Extensions.CodeGenerators.Mvc": "1.0.0-rc1-final",
"Microsoft.Extensions.Configuration.FileProviderExtensions": "1.0.0-rc1-final",
"Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final"


این reference های ضروری را به پروژه اضافه مینماید.

مرحله 3: در پروژه، یک پوشه به نام Models را اضافه نمایید و در این پوشه، یک کلاس به نام ModelClasses.cs ایجاد نمایید. کد زیر را در این کلاس وارد نمایید:

using System.Collections.Generic;
 
namespace ASPNET_Core_Diagnistics.Models
{
    public class Employee
    {
        public int EmpNo { get; set; }
        public string EmpName { get; set; }
    }
 
    public class EmployeesDatabase : List<Employee>
    {
        public EmployeesDatabase()
        {
            Add(new Employee() { EmpNo = 1, EmpName = "A" });
            Add(new Employee() { EmpNo = 2, EmpName = "B" });
            Add(new Employee() { EmpNo = 3, EmpName = "C" });
            Add(new Employee() { EmpNo = 4, EmpName = "D" });
            Add(new Employee() { EmpNo = 5, EmpName = "E" });
            Add(new Employee() { EmpNo = 6, EmpName = "F" });
        }
    }
 
    public class DataAccess
    {
        public List<Employee> Get()
        {
            return new EmployeesDatabase();
        }
    }
 
}


کد بالا شامل کلاس موجودیت کارمند میباشد و کلاس EmployeesDatabase، شامل تعدادی رکورد Employee میباشد. کلاس DataAccess شامل متد ()Get میباشد که نمونه ای از کلاس EmployeesDatabase را برمیگرداند.

مرحله 4: در همین پوشه، یک پوشه جدید به نام Services ایجاد نمایید. در پوشه Services یک کلاس به نام Services ایجاد کنید و کدهای زیر را در آن قرار دهید:

using ASPNET_Core_Diagnistics.Models;
using System.Collections.Generic;
 
namespace ASPNET_Core_Diagnistics.Services
{
    public interface IService<T> where T :class
    {
        IEnumerable<T> Get();
    }
 
    public class EmployeeService : IService<Employee>
    {
        DataAccess ds;
        public EmployeeService(DataAccess d)
        {
            ds = d;
        }
        public IEnumerable<Employee> Get()
        {
            return ds.Get();
        }
    }
}


کد بالا شامل یک اینترفیس به نام IService<T> است که T اینجا یک Type از نوع متغیر است. کلاس EmployeeService این اینترفیس را پیاده سازی میکند. سازنده EmployeeService با آبجکت DataAccess، اینجکت شده است.

مرحله 5: یک پوشه به نام Controllers ایجاد نمایید و در این پوشه از مسیر  Add > New Item > MVC Controller class یک کلاس کنترلر از نوع MVC به نام EmployeeController اضافه نمایید.

مرحله 6: در فایل Startup.cs ما باید configuration مورد نیاز را تعریف نماییم. ما از ویژگی تزریق وابستگی توکار در ASP.NET Core 1.0 استفاده میکنیم. کد زیر را در متد ()ConfigureServices در کلاس Startup.cs وارد نمایید:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddSingleton<IService<Employee>, EmployeeService>();
}


مرحله 7: برای استفاده از MVC، ما باید rout را برای اپلیکیشن تعریف نماییم. کد زیر را در متد ()Configure از کلاس Startup وارد نمایید:

public void Configure(IApplicationBuilder app)
{
    app.UseIISPlatformHandler();
 
    app.UseStaticFiles();
    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Employee}/{action=Index}/{id?}");
    });
}


مرحله 8: یک پوشه جدید به نام Views به پروژه اضافه نمایید. در این پوشه یک زیر پوشه به نام Employee ایجاد کنید. در پوشه Views، یک MVC View Imports Page اضافه نمایید و کد زیر را در آن قرار دهید:

@using ASPNET_Core_Diagnostics;
@using ASPNET_Core_Diagnostics.Models;
 
@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers"


این برای اجرای asp- attribute جدید در MVC View ها مورد استفاده قرار میگیرد.

مرحله 9: در زیر پوشه Employee از پوشه Views، یک MVC View جدید به نام Index.cshtml اضافه نمایید و کدهای زیر را در آن قرار دهید:

@model IEnumerable<ASPNET_Core_Diagnostics.Models.Employee>
 
@{
     
    ViewData["Title"] = "Index";
}
 
<h2>Index</h2>
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.EmpNo)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.EmpName)
        </th>
        <th></th>
    </tr>
 
    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.EmpNo)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.EmpName)
            </td>
        </tr>
    }
</table>


مرحله 10: اپلیکیشن را اجرا نمایید. نتیجه به صورت زیر نمایش داده میشود.

خطای 500 در mvc

این شکل خطای عمومی 500 رو نشون میده. باید شرح خطا را بتوانیم استخراج کنیم. ما میتوانیم این کار را با استفاده از Microsoft.AspNet.Diagnostics انجام دهیم. این فضای نام را در Startup.cs اضافه نمایید. در متد ()Configure، کد highlighte شده زیر را قرار دهید:

public void Configure(IApplicationBuilder app,IHostingEnvironment environment)
{
    app.UseIISPlatformHandler();
 
    if (string.Equals(environment.EnvironmentName, "Development", StringComparison.OrdinalIgnoreCase))
    {
        app.UseDeveloperExceptionPage();
          
    }
 
 
    app.UseStaticFiles();
    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Employee}/{action=Index}/{id?}");
    });
 
}


کد بالا از یک بلاک if برای چک کردن EnvironmentName استفاده میکند. این بلاک حالت اپلیکیشن را از لحاظ محیط اجرا بررسی میکند. که در کد بالا ما از development mode استفاده میکنیم. زمانی که اپلییکشن در development mode است، با استفاده از UseDeveloperException() extension، خطا یا همان exception را نشان میدهیم.

اپلیکیشن را مجددا اجرا نمایید. نتیجه به صورت زیر نمایش داده خواهد شد.

خطای mvc

در این سناریوی ما، خطایی که رخ داده است از نوع Object reference is not set to an instance of object میباشد. این نشان میدهد که حلقه foreach درست کار نمیکند. این یک مشکل در اکشن متد ()Index از کنترلر EmployeeController میباشد. کد را به صورت زیر تغییر دهید:

public class EmployeeController : Controller
{
    IService<Employee> _service;
    public EmployeeController(IService<Employee> srv)
    {
        _service = srv;
    }
    // GET: /<controller>/
    public IActionResult Index()
    {
        var Emps = _service.Get();
        return View(Emps);
    }
}


در کد بالا، ما IService<Employee> را در سازنده EmployeeController، اینجکت کرده ایم. اکشن متد ()Index، متد ()Get از IService را فراخوانی میکند.

اپلیکیشن را اجرا نمایید. نتیجه به صورت زیر نمایش داده میشود:

خطای diagnostic در mvc

خئطای بالا، خطای Unable to resolve the DataAccess را نشان میدهد. برای حل آن، باید کلاس EmployeeService  را verify نماییم. در سازنده، ما وابستگی DataAccess  را پاس داده ایم، اما آن را در متد ()ConfgureServices ثبت نکرده ایم. کد زیر را در متد ()ConfgureServices وارد نمایید:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddScoped(typeof(DataAccess));
    services.AddSingleton<IService<Employee>, EmployeeService>();
}


ما DataAccess را به عنوان وابستگی در اپلیکیشن اضافه نمودیم.

اپلیکیشن را اجرا نمایید. نتیجه به صورت زیر خواهد بود:

نتیجه نمایش کارمندان در mvc

بنابراین با استفاده از Diagnostic ها در ASP.NET Core 1.0، به آسانی توانستیم مشکل کدنویسی در اپلیکیشن را به دست آوریم و آن را حل کنیم.

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

نویسنده

امید عباسی
من امید عباسی هستم. سالهاست که در زمینه برنامه نویسی با تکنولوژی دات نت فعالیت میکنم و عاشق این هستم که تجربیات و دانش خودم را در این زمینه با دیگران به اشتراک بزارم. خیلی دوست دارم که نظر و انتقاد خودتون رو در مورد این نوشته برای من بنویسید تا بتونم در آینده، مطالب بهتر و ارزشمندتری را برای شما فراهم کنم. در صورت داشتن هرگونه سوال هم در قسمت دیدگاه ها میتونید با بنده در ارتباط باشید