Chuyển đến nội dung chính

AutoMapper → Mapperly trong ASP.NET MVC - Part 1

.NET ASP.NET Visual Studio

Đây là phần 1 trong series modernize ASP.NET MVC 5 trên .NET Framework 4.8.

Series này gồm 2 phần:

  • Part 1: migrate sang SDK-style .csproj
  • Part 2: tích hợp compile-time mapping (Mapperly)

Nếu nền móng project chưa ổn, việc tối ưu phía trên (mapping, performance, architecture) sẽ rất khó maintain về lâu dài.

Vì vậy, bài này chỉ tập trung vào một việc duy nhất: chuyển project MVC 5 sang SDK-style và chạy ổn định với IIS Express.


1. Vấn đề của project legacy

Hầu hết project ASP.NET MVC 5 lâu năm đều có đặc điểm chung:

  • .csproj dạng cũ (old-style)
  • Khai báo file thủ công
  • Sử dụng packages.config

Những vấn đề thường gặp:

  • File .csproj dài hàng trăm dòng, khó đọc
  • Thêm/xóa file → phải sửa project file
  • Merge conflict xảy ra thường xuyên

Project vẫn chạy — nhưng càng ngày càng khó maintain.


2. SDK-style giải quyết điều gì?

SDK-style .csproj mang lại cách tiếp cận đơn giản hơn:

  • Tự động include toàn bộ *.cs
  • Không cần khai báo từng file
  • Hỗ trợ PackageReference hiện đại
  • File .csproj gọn hơn rất nhiều

Hiểu đơn giản: từ config thủ công → config theo convention.


3. Điểm quan trọng nhất: chọn đúng SDK

SDKKết quả
Microsoft.NET.Sdk❌ IIS Express không chạy
Microsoft.NET.Sdk.Web✅ Hoạt động bình thường

Dù tên là Web, SDK này không chỉ dành cho ASP.NET Core. Nó hoạt động tốt với ASP.NET MVC 5 trên .NET Framework 4.8.


4. Cấu hình .csproj chuẩn cho MVC 5

Đây là cấu hình tối thiểu để project chạy đúng với IIS Express:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net48</TargetFramework>

    <!-- Bắt buộc cho MVC 5 -->
    <OutputType>Library</OutputType>
    <IsAspNetCoreProject>false</IsAspNetCoreProject>

    <!-- IIS Express yêu cầu output tại bin\ -->
    <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
    <OutputPath>bin\</OutputPath>

    <UseIISExpress>true</UseIISExpress>
  </PropertyGroup>

</Project>

Những dòng này nhìn đơn giản, nhưng thiếu một dòng là có thể lỗi runtime.


5. Diff: old-style vs SDK-style

Old-style (rút gọn):

<Project>

  <ItemGroup>
    <Compile Include="Controllers\HomeController.cs" />
    <Compile Include="Models\Product.cs" />
    ...
  </ItemGroup>

</Project>

SDK-style:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>net48</TargetFramework>
  </PropertyGroup>
</Project>

SDK-style tự động include file → không cần khai báo thủ công nữa.


6. Những lỗi thường gặp

Lỗi 1: IIS Express không chạy

Nguyên nhân: dùng Microsoft.NET.Sdk

Fix:

<Project Sdk="Microsoft.NET.Sdk.Web">

Lỗi 2: Missing Main()

Nguyên nhân: project bị build như executable

Fix:

<OutputType>Library</OutputType>

Lỗi 3: Không load được assembly

Nguyên nhân: output sai thư mục

Fix:

<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<OutputPath>bin\</OutputPath>

Lỗi 4: 404 toàn bộ Views

Nguyên nhân: conflict Content items

Fix: kiểm soát lại include hoặc tắt default items nếu cần


7. Kết quả sau khi migrate

  • .csproj từ vài trăm dòng → còn vài chục dòng
  • Giảm đáng kể merge conflict
  • Thêm/xóa file không cần sửa project file

Quan trọng hơn: project trở nên “dễ thở” hơn rất nhiều.


8. Bước tiếp theo

Sau khi đã migrate sang SDK-style, bạn đã có nền tảng tốt để:

  • Refactor architecture
  • Thêm Dependency Injection
  • Chuyển sang compile-time mapping (Mapperly)

Phần tiếp theo mình sẽ tập trung vào: thay AutoMapper bằng Mapperly và so sánh chi tiết.


Kết luận

SDK-style không phải là thay đổi “hào nhoáng”, nhưng lại là một trong những nâng cấp đáng giá nhất cho project legacy.

Nó giúp:

  • Giảm độ phức tạp
  • Tăng khả năng maintain
  • Mở đường cho các nâng cấp tiếp theo

Nói ngắn gọn: dọn nền móng trước, rồi hãy xây tầng trên.

Nhận xét

Bài đăng phổ biến từ blog này

[ASP.NET MVC] Authentication và Authorize

Một trong những vấn đề bảo mật cơ bản nhất là đảm bảo những người dùng hợp lệ truy cập vào hệ thống. ASP.NET đưa ra 2 khái niệm: Authentication và Authorize Authentication xác nhận bạn là ai. Ví dụ: Bạn có thể đăng nhập vào hệ thống bằng username và password hoặc bằng ssh. Authorization xác nhận những gì bạn có thể làm. Ví dụ: Bạn được phép truy cập vào website, đăng thông tin lên diễn đàn nhưng bạn không được phép truy cập vào trang mod và admin.

ASP.NET MVC: Cơ bản về Validation

Validation (chứng thực) là một tính năng quan trọng trong ASP.NET MVC và được phát triển trong một thời gian dài. Validation vắng mặt trong phiên bản đầu tiên của asp.net mvc và thật khó để tích hợp 1 framework validation của một bên thứ 3 vì không có khả năng mở rộng. ASP.NET MVC2 đã hỗ trợ framework validation do Microsoft phát triển, tên là Data Annotations. Và trong phiên bản 3, framework validation đã hỗ trợ tốt hơn việc xác thực phía máy khách, và đây là một xu hướng của việc phát triển ứng dụng web ngày nay.

Tổng hợp một số kiến thức lập trình về Amibroker

Giới thiệu về Amibroker Amibroker theo developer Tomasz Janeczko được xây dựng dựa trên ngôn ngữ C. Vì vậy bộ code Amibroker Formula Language sử dụng có syntax khá tương đồng với C, ví dụ như câu lệnh #include để import hay cách gói các object, hàm trong các block {} và kết thúc câu lệnh bằng dấu “;”. AFL trong Amibroker là ngôn ngữ xử lý mảng (an array processing language). Nó hoạt động dựa trên các mảng (các dòng/vector) số liệu, khá giống với cách hoạt động của spreadsheet trên excel.