<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rakib Ahasan</title>
    <description>The latest articles on DEV Community by Rakib Ahasan (@rakibahasan).</description>
    <link>https://dev.to/rakibahasan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3216481%2Fdf5e74e0-d850-4f2c-822b-a2611f626f34.jpg</url>
      <title>DEV Community: Rakib Ahasan</title>
      <link>https://dev.to/rakibahasan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rakibahasan"/>
    <language>en</language>
    <item>
      <title>.NET Folder Structure: A to Z</title>
      <dc:creator>Rakib Ahasan</dc:creator>
      <pubDate>Fri, 09 Oct 2026 09:00:00 +0000</pubDate>
      <link>https://dev.to/rakibahasan/net-folder-structure-a-to-z-467g</link>
      <guid>https://dev.to/rakibahasan/net-folder-structure-a-to-z-467g</guid>
      <description>&lt;h2&gt;
  
  
  শুরুর কথা
&lt;/h2&gt;

&lt;p&gt;প্রজেক্ট শুরু করলে ফাইল থাকে হাতে গোনা ৫-৬টা। দুই মাস পর সেটা হয়ে যায় ২০০টা। তখন হঠাৎ payment-এ একটা bug ধরতে হবে, আর তুমি বুঝতেই পারছ না কোন ফোল্ডারে ঢুকবে।&lt;/p&gt;

&lt;p&gt;অনেকেই এই জায়গায় ১০ মিনিট শুধু ফাইল খুঁজে সময় নষ্ট করে। টিমে নতুন কেউ এলে তো তার অবস্থা আরও খারাপ।&lt;/p&gt;

&lt;p&gt;তাই আমি folder structure-কে বলি প্রজেক্টের map। map ঠিক থাকলে যেকোনো জায়গায় ২ সেকেন্ডে পৌঁছে যাওয়া যায়।&lt;/p&gt;




&lt;h2&gt;
  
  
  ১. Clean Architecture-এর মূল ধারণা
&lt;/h2&gt;

&lt;p&gt;Clean Architecture-এ ৪টা layer থাকে। পেঁয়াজের খোসার মতো ভাবো, একটার ভেতরে আরেকটা।&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────┐
│   Presentation (API)            │
│  ┌───────────────────────────┐  │
│  │   Infrastructure          │  │
│  │  ┌─────────────────────┐  │  │
│  │  │   Application       │  │  │
│  │  │  ┌───────────────┐  │  │  │
│  │  │  │   Domain      │  │  │  │
│  │  │  └───────────────┘  │  │  │
│  │  └─────────────────────┘  │  │
│  └───────────────────────────┘  │
└─────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;মূল নিয়ম:&lt;/strong&gt; বাইরের layer ভেতরের layer-কে চেনে। ভেতরের layer বাইরের কাউকে চেনে না।&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;মানে Domain জানেই না SQL Server কী জিনিস। Application জানে না Controller কী। কিন্তু API সবাইকে চেনে।&lt;/p&gt;

&lt;p&gt;এভাবে করার কারণ সোজা। Database বদলাবে, UI বদলাবে, কিন্তু business logic মোটামুটি একই থাকবে। তাই সেটাকে আলাদা করে সুরক্ষিত রাখি।&lt;/p&gt;




&lt;h2&gt;
  
  
  ২. চারটা Layer, একে একে
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Domain: বাড়ির ইট
&lt;/h3&gt;

&lt;p&gt;প্রজেক্টের কেন্দ্র। Business-এর আসল ধারণাগুলো এখানে থাকে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;থাকে:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Entities&lt;/strong&gt;: যেমন &lt;code&gt;Student&lt;/code&gt;, &lt;code&gt;Course&lt;/code&gt;, &lt;code&gt;Enrollment&lt;/code&gt;। দেখতে table-এর মতো, কিন্তু business rule সহ&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value Objects&lt;/strong&gt;: যেগুলোর আলাদা id লাগে না, যেমন &lt;code&gt;Money&lt;/code&gt;, &lt;code&gt;Address&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enums&lt;/strong&gt;: &lt;code&gt;EnrollmentStatus.Active&lt;/code&gt;, &lt;code&gt;PaymentStatus.Paid&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain Events&lt;/strong&gt;: &lt;code&gt;StudentEnrolled&lt;/code&gt;, &lt;code&gt;PaymentCompleted&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;থাকে না:&lt;/strong&gt; database, API, &lt;code&gt;DbContext&lt;/code&gt;, &lt;code&gt;HttpContext&lt;/code&gt;, আর প্রায় কোনো NuGet package-ই না।&lt;/p&gt;

&lt;h3&gt;
  
  
  Application: বাড়ির নকশা
&lt;/h3&gt;

&lt;p&gt;এখানে ঠিক হয় কী হবে আর কীভাবে হবে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;থাকে:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Services&lt;/strong&gt;: &lt;code&gt;EnrollmentService&lt;/code&gt;, &lt;code&gt;PaymentService&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interfaces&lt;/strong&gt;: &lt;code&gt;IEnrollmentRepository&lt;/code&gt;, &lt;code&gt;IEmailSender&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DTOs&lt;/strong&gt;: &lt;code&gt;EnrollmentRequestDto&lt;/code&gt;, &lt;code&gt;PaymentResponseDto&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validators&lt;/strong&gt; (FluentValidation) আর &lt;strong&gt;Mappings&lt;/strong&gt; (AutoMapper)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;থাকে না:&lt;/strong&gt; database connection, HTTP call, কোনো concrete implementation।&lt;/p&gt;

&lt;p&gt;একটা প্রশ্ন সবাই করে: &lt;code&gt;IEnrollmentRepository&lt;/code&gt; এখানে, তাহলে implementation কোথায়? উত্তর, Infrastructure-এ। এটাই Dependency Inversion।&lt;/p&gt;

&lt;h3&gt;
  
  
  Infrastructure: বাড়ির প্লাম্বিং
&lt;/h3&gt;

&lt;p&gt;বাইরের জগতের সাথে সব যোগাযোগ এখানে। Database, payment gateway, email, file system।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;থাকে:&lt;/strong&gt; &lt;code&gt;AppDbContext&lt;/code&gt;, repository-র implementation, &lt;code&gt;AdyenPaymentService&lt;/code&gt;, &lt;code&gt;SendGridEmailService&lt;/code&gt;, EF configuration, migrations।&lt;/p&gt;

&lt;p&gt;একটা মজার টেস্ট: পুরো Infrastructure project মুছে দিলেও Application layer টের পাবে না। কারণ সে শুধু interface চেনে।&lt;/p&gt;

&lt;h3&gt;
  
  
  Presentation (API): বাড়ির দরজা
&lt;/h3&gt;

&lt;p&gt;HTTP request এখান দিয়েই ঢোকে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;থাকে:&lt;/strong&gt; Controllers, Middleware, Filters, আর &lt;code&gt;Program.cs&lt;/code&gt; (DI setup আর pipeline)।&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Controller-এ business logic লিখো না। Controller শুধু HTTP সামলাবে, বাকি কাজ service-এর।&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;বাড়ির সাথে তুলনা&lt;/th&gt;
&lt;th&gt;কাজ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Domain&lt;/td&gt;
&lt;td&gt;ইট, সিমেন্ট&lt;/td&gt;
&lt;td&gt;মূল উপাদান&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application&lt;/td&gt;
&lt;td&gt;নকশা&lt;/td&gt;
&lt;td&gt;কী হবে, কীভাবে হবে&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure&lt;/td&gt;
&lt;td&gt;প্লাম্বিং, বিদ্যুৎ&lt;/td&gt;
&lt;td&gt;বাইরের সাথে যোগাযোগ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Presentation&lt;/td&gt;
&lt;td&gt;দরজা&lt;/td&gt;
&lt;td&gt;সবার প্রবেশপথ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ৩. বাস্তব Folder Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SchoolApp/
├── src/
│   ├── SchoolApp.Domain/
│   │   ├── Entities/        (Student, Course, Enrollment)
│   │   ├── ValueObjects/    (Money, Address)
│   │   ├── Enums/
│   │   ├── Events/
│   │   └── Common/          (BaseEntity)
│   │
│   ├── SchoolApp.Application/
│   │   ├── Services/
│   │   ├── Interfaces/
│   │   ├── DTOs/
│   │   ├── Validators/
│   │   └── Mappings/
│   │
│   ├── SchoolApp.Infrastructure/
│   │   ├── Persistence/     (AppDbContext, Repositories, Configurations)
│   │   ├── Services/        (AdyenPaymentService, SendGridEmailService)
│   │   └── Migrations/
│   │
│   └── SchoolApp.API/
│       ├── Controllers/
│       ├── Middleware/
│       ├── Program.cs
│       └── appsettings.json
│
└── tests/
    ├── SchoolApp.UnitTests/
    └── SchoolApp.IntegrationTests/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ৪. Request-এর যাত্রা
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP Request
   ↓
Controller            (API)
   ↓
Service               (Application)
   ↓
Repository Interface  (Application)
   ↓
Repository Impl       (Infrastructure)
   ↓
DbContext → Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;উপর থেকে নিচে যায় request, নিচ থেকে উপরে আসে response। প্রতিটা layer শুধু তার ঠিক পরের layer-কে ডাকে। Controller সরাসরি &lt;code&gt;DbContext&lt;/code&gt; ধরবে না।&lt;/p&gt;




&lt;h2&gt;
  
  
  ৫. ছোট একটা উদাহরণ: Enrollment
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Controller (API)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;HttpPost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"enroll"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IActionResult&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;Enroll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;EnrollmentRequestDto&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_enrollmentService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;EnrollAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Service (Application)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;EnrollmentResponseDto&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;EnrollAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;EnrollmentRequestDto&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;course&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_courseRepository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetByIdAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CourseId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;course&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Seats&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;BusinessException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"No seats available"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;enrollment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Enrollment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StudentId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;course&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_enrollmentRepository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;enrollment&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_mapper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;EnrollmentResponseDto&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;enrollment&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Repository (Infrastructure)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Course&lt;/span&gt;&lt;span class="p"&gt;?&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;GetByIdAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_dbContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Courses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FirstOrDefaultAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;খেয়াল করো, Service-এ business rule (&lt;code&gt;Seats &amp;lt;= 0&lt;/code&gt;) আছে কিন্তু database-এর নাম নেই। Repository-তে database আছে কিন্তু কোনো business rule নেই। এটাই পুরো ব্যাপারটার সারকথা।&lt;/p&gt;




&lt;h2&gt;
  
  
  ৬. নতুনদের ৬টা কমন ভুল
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Controller-এ business logic লেখা।&lt;/strong&gt; সবচেয়ে বেশি দেখা যায়।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain-এ &lt;code&gt;DbContext&lt;/code&gt; ব্যবহার।&lt;/strong&gt; Domain database চেনে না।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Application-এ concrete class ব্যবহার।&lt;/strong&gt; সবসময় interface নাও।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repository-তে business logic ঢোকানো।&lt;/strong&gt; Repository শুধু data আনবে-নেবে।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;সব কিছু এক project-এ ফেলে রাখা।&lt;/strong&gt; অন্তত আলাদা folder তো করো।&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DTO ছাড়া Entity return করা।&lt;/strong&gt; Entity সরাসরি বাইরে পাঠিও না।&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  ৭. কখন এই structure লাগবে না?
&lt;/h2&gt;

&lt;p&gt;সত্যি কথা, ছোট প্রজেক্টে এটা overkill। ৫-১০টা endpoint-এর জন্য ৪টা project আর ২০টা folder বানালে দেখবে মাত্র ৩টা class-এর জন্য এত ঝামেলা।&lt;/p&gt;

&lt;p&gt;আমার নিয়ম: &lt;em&gt;কোনো pattern তখনই আনো, যখন সেটা না থাকার কষ্ট, রক্ষণাবেক্ষণের কষ্টের চেয়ে বেশি।&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;প্রজেক্টের সাইজ&lt;/th&gt;
&lt;th&gt;যা করবে&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;৫-১০ endpoint&lt;/td&gt;
&lt;td&gt;এক project, simple folder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;২০-৫০ endpoint&lt;/td&gt;
&lt;td&gt;এক project, আলাদা folder (Domain, Services, Data)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;৫০+ endpoint বা টিমে ২+ জন&lt;/td&gt;
&lt;td&gt;Clean Architecture&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  শেষ কথা
&lt;/h2&gt;

&lt;p&gt;Folder structure আসলে দায়িত্ব ভাগ করে দেওয়ার ব্যাপার। Database-এর কাজ database করবে, business-এর কাজ business, আর presentation-এর কাজ presentation।&lt;/p&gt;

&lt;p&gt;প্রতিটা class যখন শুধু নিজের কাজটাই করে, তখন পুরো প্রজেক্ট বোঝা সহজ হয়, test করা সহজ হয়, আর বদলানোও সহজ হয়।&lt;/p&gt;

&lt;p&gt;এটা কোনো কঠিন নিয়ম না। এটা common sense।&lt;/p&gt;

</description>
      <category>dotnetcore</category>
      <category>csharp</category>
      <category>cleancode</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
