10 تغییر اساسی در Asp.net5 و MVC6

شنبه 25 مهر 1394

در این مقاله به 10 تغییر که در Asp.net 5 صورت گرفته ( نسبت به نسخه قبل) اشاره می کنیم. یاد خواهید گرفت که چه ویژگی های جدیدی به این نسخه ها افزوده شده است و اینکه چه تفاوتی با نسخه های پیشین دارند.

10 تغییر اساسی در Asp.net5  و MVC6

در این مقاله  به 10 تغییر که در Asp.net 5 صورت گرفته ( نسبت به نسخه قبل) اشاره می کنیم.

1- ASP.NETدر OSX  و  Linux

Linux and OSX

برای اولین بار در تاریخ Asp.net این برنامه میتواند بر روی لینوکس و OSX  اجرا شود.با این کار کلیه برنامه نویسان و طراحان می توانند از ASP.NET استفاده کنند.

مخاطبان سنتی ASP.NET برنامه نویسانی بودند که در شرکت های بزرگ کار می کردند و مشتری های این شرکت ها هم دارای سیستم های ویندوزی بودند.ولی مثلا در StartUp تمایل دارند که از سیستم های لینوکس و OSX استفاده کنند.هر وقت من در کنفرانس های StartUp شرکت می کنم تنها سیستمی که می بینم Macbook  است .عکس زیر از کنفرانس jQuery این شرکت گرفته شده است

jQuery Conference

توانایی Asp.net5  برای اجرا روی سیستم های ویندوز ، لینوکس و OSX همه چیز را تغییر می دهد.برای اولین بار هر طراح و برنامه نویسی قادر خواهد بود برای اپلیکیشن های خود از Asp.net5   استفاده کند.همچنین آنها مجبور به استفاده از Visual Studio نیستند و می توانند محیط توسعه دلخواه خود مانند WebStorm  و یا Sublime Text را انتخاب کنند.

 2-فارغ از Web Forms

خود من عاشق Web Forms هستم.صدها شاید هم هزارها برنامه وب فرم نوشته ام ولی الان باید به آن گفت خداحافظ! Web Formsدیگر بخشی از Asp.net5  نیست.شما می توانید همچنان به ساخت وب فرم ها ادامه دهید اما در ویژوال 2015 و با .NET4.6

اما این را بدانید که وب فرم هیچ مزیتی نسبت به ویژگیهای جدید Asp.net5   ندارد و برای اینکه از دنیای برنامه نویسی عقب نیافتید برنامه های وب فرم خود را به روش ASP.NET MVC بازنویسی نمایید.

3-فارغ از Visual Basic

Visual Basic

در Asp.net5   از ویژوال بیسیک هم اثری نیست. Asp.net5   تنها از C# پشتیبانی می کند.امیدوارم که این تغییر شما را زیاد ناراحت نکرده باشد.من معتقدم که تنها دو نفر در کل دنیا هستند که پروژه MVC را با زبان  Visual Basic می نویسند! برای همان دو نفر هم بهتر است که دست از این کار بردارند .البته تبدیل کننده های بیسیک به سی شارپ هم وجود دارند .

4- Tag Helper ها

این تگ ها جایگزینی برای Helper های سنتی MVC هستند.

در کد زیر یک فرمی داریم که کار آن ایجاد یک محصول جدید است

@model MyProject.Models.Product
 
 
@using (Html.BeginForm())
{
    <div>
        @Html.LabelFor(m => p.Name, "Name:")
        @Html.TextBoxFor(m => p.Name)
    </div>
    <input type="submit" value="Create" />
}

در کد بالا Html.BeginForm(), Html.LabelFor(), Html.TextBoxFor در واقع helper هایی هستند که برای ایجاد فرم استفاده شده اند این Helper ها برای کسانی که با Html کار کرده اند ناآشنا است. حال همان فرم بالا را به کمک Tag Helper ها بازنویسی می کنیم.

@model MyProject.Models.Product
@addtaghelper "Microsoft.AspNet.Mvc.TagHelpers"
 
<form asp-controller="Products" asp-action="Create" method="post">
    <div>
        <label asp-for="Name">Name:</label>
        <input asp-for="Name" />
    </div>
 
    <input type="submit" value="Save" />
</form>

اگر دقت کرده باشید می بینید که Tag Helper بسیار شبیه Html است .مثلا به جای استفاده از Html.TextBoxFor از input استفاده شده است.در این کد از asp-for استفاده شده است و دلیل آن استفاده از آن Helper در سمت سرور می باشد.

5- View Components

به جای SubController جایگزین دیگری قرار گرفته است به نام View Component.در نسخه های قبلی Mvc برای فراخوانی یک Action از Html.Action استفاده می کردیم ولی دیگر نیازی به این کار نیست.

کد زیر نحوه ساخت یک View Component را نشان می دهد.

using Microsoft.AspNet.Mvc;
using System;
 
namespace Partials.Components
{
    public class BannerAd : ViewComponent
    {
        public IViewComponentResult Invoke()
        {
            var adText = "Buy more coffee!";
 
            if (DateTime.Now.Hour > 18)
            {
                adText = "Buy more warm milk!";
            }
            return View("_Advertisement", adText);
        }
    }
} 

با توجه به کد اگر قبل از ساعت 6 بعد از ظهر باشیم View Component یک متنی به صورت Buy more coffee! بر می گرداند واگر بعد از ساعت 6 باشد متن به صورت Buy more warm milk! خواهد بود .

کد مربوط به صفحه Partial به صورت زیر خواهد بود.

@model string
 
<div style="border:2px solid green;padding:15px">
    @Model
</div>

برای استفاده از View Component کد زیر را استفاده می کنیم .

	
@Component.Invoke("BannerAd")

6- GruntJS, NPM و پشتیبانی Browser

GruntJS

کسانی که طراح هستند از اینکه Asp.net5  از Gruntjs پشتیبانی می کند بسیار خوشحالند.

Gruntjs یک Task Runner است که وظیفه جاوا اسکریپت را اجرا می کند.و بسیاری از کارهای طراحی وب را خودکار می کند.برای اینکه Asp.net5  از Gruntjs پشتیبانی کند نیاز داشت که دو کار انجام دهد.یک پشتیبانی از  NPM چون پلاگین های GruntJS توزیعی از پکیجی NPM هستند. و دومی Browser

۷ – یکپارچه کردن MVC و کنترلرهای WebAPI

در نسخه های قبلی mvc کنترلر های mvc و Web API با هم متفاوت بودند. کنترلرهای MVC در کلاس پایه System.Web.MVC.Controller بود و کنترلرهای Web Api در کلاس پایه System.Web.Http.ApiController  بودند.اما در mvc6 فقط یک کلاس به نام Microsoft.AspNet.Mvc.Controller برای هردو اینها وجود دارد.در mvc6  هر کنترلری یک IActionResult بر می گرداند که بسته به اینکه شما از کدام کنترلر استفاده کنید تغییر می کند یعنی اگر به عنوان یک کنترلر MVC استفاده شوند به شکل یک View خود را نمایش می دهند و اگر به عنوان کنترلر Web Api استفاده شوند به شکل دیتا خود را نشان می دهند.

کنترلر های MVC6  چه از نوع MVC  و چه از نوع Web Api توسط rout یکسان مدیریت می شوند.

۸ – AngularJS

AngularJS یکی از معروفترین فرم ورک ها سمت کلاینت برای توسعه برنامه های SPA و با همان Single Page Application هستند. ویژوال استودیو ۲۰۱۵ شامل Template هایی برای ساختن ماژول ها(modules)، کنترلرها(controllers)  و (directives) و (factories) است.

پشتیبانی ASP.NET 5  از GruntJS باعث شده که ASP.NET یک فریم ورک سمت سرور عالی برای ایجاد اپلیکیشن های سمت کلاینت AngularJS باشد.

9- Dependency Injection در Asp.net5

Asp.net5 از Service Locator و DI پشتیبانی می کند. پس دیگر نیازی به استفاده از یک فرم ورک خارجی برای DI نیست.

فرض کنید که یک اینترفیس IRepository و یک کلاس EFRepository ایجاد کرده اید که قرار است اینترفیس شما را پیاده سازی کند. در این مثال شما میتوانید کلاس EFRepository را به اینترفیس IRepository  در متد ConfigureService() موجود در Startup.cs بایند کنید،کد ان مانند زیر است :

services.AddTransient<IRepository, EFRepository>();

 بعد از اینکه EFRepository و Irepository را بایند کردید میتوانید از constructor  متعلق به DI در کنترلرهای MVC (یا هر کلاس دیگر) به طریق زیر استفاده کنید

public class ProductsController : Controller
{
    private IRepository _repo;
 
    public ProductsController(IRepository repo)
    {
        _repo = repo;
    }
}

 در کد فوق اینترفیس Irepository به داخل کانسترااکتور یک کنترلر پاس داده می شود . فریم ورک DI درونی ASP.NET ، باعث می شود که  EFRepository به ProductsController پاس داده شود ، چون پیش از این در کلاس Startup اینترفیس Irepository به EFRepository بایند شده است.

همچنین می توانید از الگوی Service Locator استفاده کنید. هر جا به HttpContext دسترسی داشته باشید، می توانید به هر نوع سرویس رجیستر شده دسترسی داشته باشید. برای مثال می توانید EFRepository را به کمک کد زیر درون یک اکشن، بازیابی کنید.

var repo = this.Context.ApplicationServices.GetRequiredService<IRepository>();

10- xUnit.net

Unit test  از دو Attribute  به نام های [TestClass] و[TestMethod] استفاده می کند مانند کد زیر 

[TestClass]
public class CalculatorTests {
 
    [TestMethod]
    public void TestAddNumbers() {
        // Arrange
        var calc = new Calculator();
 
        // Act
        var result = calc.AddNumbers(0, 0);
 
        // Assert
        Assert.AreEqual(0, result);
 
    }
 
}

وقت خداحافظی با Unit Test در ویژوال استودیو است.در ASP.NET 5 از xUnit.net به عنوان فرم ورک تست استفاده می شود. این این فریم ورک از اتریبیوت [Fact] به جای [TestMethod] استفاده میکند

public class CalculatorTests
{
    [Fact]
    public void AddNumbers()
    {
        // Arrange
        var calculator = new Calculator();
 
        // Act
        var result = calculator.AddNumbers(1, 1);
 
        // Assert
        Assert.Equal(result, 13);
    }
}

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید