Project Structure

.NET Core project structure and best practices for organizing your code.

Understanding the standard project structure in .NET Core applications is crucial for maintainability, scalability, and collaboration. While there's flexibility, common conventions help ensure consistency across projects.

Standard Project Layout

A typical .NET Core project, especially for web applications, will have a structure that facilitates separation of concerns and clear organization. Here's a breakdown of common directories and their purposes:

Root Directory

Controllers Directory

This directory typically houses the application's controllers, which handle incoming HTTP requests, process them, and return responses. In MVC patterns, controllers act as the "C" in MVC.


/Controllers
    HomeController.cs
    ProductsController.cs
    AccountController.cs
        

Models Directory

Contains classes that represent the application's data and business logic. This can include data transfer objects (DTOs), entities for database interaction (e.g., using Entity Framework Core), and business rule implementations.


/Models
    Product.cs
    User.cs
    Order.cs
    ViewModel.cs
        

Views Directory (for web applications)

Holds the presentation layer of the application, typically HTML files with embedded C# code (Razor syntax). This directory is often further organized by controller name.


/Views
    Home
        Index.cshtml
        About.cshtml
    Products
        List.cshtml
        Details.cshtml
    Shared
        _Layout.cshtml
        _ValidationScriptsPartial.cshtml
        

wwwroot Directory

Contains static assets for the web application, such as HTML, CSS, JavaScript files, images, and favicons. These files are served directly to the client.


/wwwroot
    css
        site.css
    js
        site.js
    images
        logo.png
    favicon.ico
        

Services or BusinessLogic Directory

For larger applications, it's common to create directories to encapsulate business logic and services that are independent of the web layer. This promotes the Single Responsibility Principle.


/Services
    IProductService.cs
    ProductService.cs
    IUserService.cs
    UserService.cs
        

Data Directory

Often used to group data-related components, such as database contexts (e.g., Entity Framework Core's DbContext), repositories, and data access logic.


/Data
    ApplicationDbContext.cs
    Repositories
        IProductRepository.cs
        ProductRepository.cs
        

Note on ASP.NET Core 6+

In ASP.NET Core 6 and later, the Startup.cs class is often replaced by minimal API hosting model integrated directly into Program.cs. This simplifies the project structure for many common scenarios.

Best Practices for Organization

Separation of Concerns

Organize your code into distinct layers or components based on their responsibilities (e.g., presentation, business logic, data access). This makes the code easier to understand, test, and maintain.

Consistent Naming Conventions

Adhere to standard C# naming conventions (PascalCase for types, methods, properties; camelCase for local variables and parameters). Use descriptive names for files, folders, classes, and members.

Modularity

Break down large applications into smaller, manageable modules or libraries. This is especially beneficial for large teams or complex projects.

Dependency Injection

Leverage .NET's built-in dependency injection system to manage object creation and dependencies. This promotes loose coupling and testability.

Configuration Management

Use configuration files (like appsettings.json) and options patterns to manage application settings, making it easy to adapt the application to different environments without code changes.

Example Project Structure (Web API)

A typical .NET Core Web API project might look like this:


/MyAwesomeApi
    /Controllers
        ItemsController.cs
    /Models
        Item.cs
    /Services
        IItemService.cs
        ItemService.cs
    /Data
        ApplicationDbContext.cs
        Repositories
            IItemRepository.cs
            ItemRepository.cs
    Program.cs
    appsettings.json
    MyAwesomeApi.csproj
        

Conclusion

A well-defined project structure is a foundation for a healthy and sustainable .NET application. By following conventions and best practices, you can create code that is robust, adaptable, and easy for teams to work with.