ارتقا به dotnetcore 2


۱ سال پیش چهارشنبه ۲۵ مرداد ۱۳۹۶ ساعت ۴:۳۴

نکات و تغییرات مهم برای مهاجرت از dotnet core 1 به donet core 2
۱- دانلود و نصب dotnet core 2 و بروزرسانی ویژوال استدیو ۲۰۱۷ ویا نصب Visual Studio 2017 version 15.3 
۲- ویرایش فایل csproj :

  • تغییر TargetFramework
<TargetFramework>netcoreapp2.0</TargetFramework>
  • حذف تمام رفرنس‌هایی که در لیست وابستگی‌های پکیج Microsoft.AspNetCore.All وجود دارند و افزودن رفرنس آن بجای رفرنس‌های حذف شده.
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
۳- روش ارتقاء به EF Core 2.0 
حداقل وابستگی‌های مورد نیاز جهت کار با EF Core 2.0 و همچنین اجرای مهاجرت‌های آن به صورت ذیل است:
<ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.0.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0" PrivateAssets="All" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" PrivateAssets="All" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="2.0.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.0" />
  </ItemGroup>
  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
  </ItemGroup>

سپس تغییر مهم دیگر، ندید گرفتن پارامتر startup-project به طور کامل است (نکته‌ای که در مطلب فوق در مورد آن بحث شده‌است). اگر Context برنامه‌ی شما دارای پارامتر است، EF Core 2.0 «در حین اجرای مهاجرت‌ها» به صورت صریح نیاز دارد بداند که چطور باید این Context را وهله سازی کرد و دیگر مانند قبل سعی نمی‌کند وابستگی‌های تزریق شده‌ی در آن‌را حدس بزند:
Unable to create an object of type 'ApplicationDbContext'.
Add an implementation of 'IDesignTimeDbContextFactory<ApplicationDbContext>' to the project,
or see https://go.microsoft.com/fwlink/?linkid=851728 for additional patterns supported at design time.
به همین جهت در اینجا باید اینترفیس جدید IDesignTimeDbContextFactory را پیاده سازی کرده و سپس مشخص کنید چگونه می‌توان یک ApplicationDbContext را وهله سازی کرد:
public class ApplicationDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext>
    {
        public ApplicationDbContext CreateDbContext(string[] args)
        {
            return new ApplicationDbContext(siteSettings, httpContextAccessor, hostingEnvironment, logger);
        }
    }
این کلاس ویژه باید در اسمبلی قرار گیرد که Context برنامه در آن تعریف شده‌است و یافتن آن توسط EF Core 2.0 خودکار است.
یک نمونه پیاده سازی کامل آن را که در پروژه‌ی DNTIdentity بکار رفته‌است، در اینجا می‌توانید مشاهده کنید.
 

۴- تغیرات مربوط به افزودن Authentication
استفاده از متد AddCookieAuthentication و UseJwtBearerAuthentication در تابع Configure که در فایل Startup.cs منسوخ شده‌است، و برای افزودن تنظیمات Authentication در dotnet core 2 می‌توانید به شیوه زیر تغییرات را در فایل Startup.cs پروژه اعمال کنید.

  • در تابع ConfigureServices 

//in public IServiceProvider ConfigureServices(IServiceCollection services) method
services.AddAuthentication(o =>
{
    o.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    o.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    o.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie(options =>
{
    options.SlidingExpiration = true;
    options.ExpireTimeSpan = new TimeSpan(0, int.Parse(Configuration["Auth:ExpiresUtcMinutes"]), 0);

    options.LoginPath = new PathString("/accounts/Login/");
    options.AccessDeniedPath = new PathString("/accounts/Forbidden/");
    options.LogoutPath = new PathString("/accounts/Logout");
});

  • در تابع Configure بجای استفاده از AddCookieAuthentication از UseAuthentication استفاده‌کنید.
	
//in public void Configure(IApplicationBuilder app) method
//app.AddCookieAuthentication(new CookieAuthenticationOptions
//{
//    CookieName = Configuration["Auth:AuthCookieName"],
//    AuthenticationScheme = Configuration["Auth:AuthenticationScheme"],
//    LoginPath = new PathString("/accounts/Login/"),
//    AccessDeniedPath = new PathString("/accounts/Forbidden/"),
//    AutomaticAuthenticate = true,
//    AutomaticChallenge = true,
//    SlidingExpiration = true,
//    ExpireTimeSpan = new TimeSpan(0, int.Parse(Configuration["Auth:ExpiresUtcMinutes"]), 0)
//});
app.UseAuthentication();

* من از ایمیل شما برای نمایش تصویر شما توسط سرویس gravatar استفاده خواهم کرد. من هم مثل شما از اسپم متنفرم.