{"id":18656452,"url":"https://github.com/manusoft/democqrs","last_synced_at":"2025-11-05T21:30:20.325Z","repository":{"id":244015424,"uuid":"814018220","full_name":"manusoft/DemoCQRS","owner":"manusoft","description":"Sample of CQRS with MediatR - Asp.Net Web API dotnet-8","archived":false,"fork":false,"pushed_at":"2024-10-03T05:34:24.000Z","size":15,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-12-27T14:44:30.485Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/manusoft.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-06-12T07:26:24.000Z","updated_at":"2024-10-03T05:34:28.000Z","dependencies_parsed_at":"2024-06-12T14:12:18.353Z","dependency_job_id":"f365b0be-f706-41da-b16d-157a00b7541f","html_url":"https://github.com/manusoft/DemoCQRS","commit_stats":null,"previous_names":["manusoft/democqrs"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manusoft%2FDemoCQRS","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manusoft%2FDemoCQRS/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manusoft%2FDemoCQRS/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manusoft%2FDemoCQRS/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/manusoft","download_url":"https://codeload.github.com/manusoft/DemoCQRS/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239471766,"owners_count":19644375,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-07T07:23:36.447Z","updated_at":"2025-11-05T21:30:20.198Z","avatar_url":"https://github.com/manusoft.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DemoCQRS - ASP.NET Web API Project\n\n\u003cp align=\"left\"\u003e\u003cimg src=\"https://visitor-badge.laobi.icu/badge?page_id=manusoft.DemoCQRS\" alt=\"visitor\" style=\"max-width: 100%;\"\u003e\u003c/p\u003e\n\nDemoCQRS is an ASP.NET Web API project showcasing the implementation of the Command Query Responsibility Segregation (CQRS) pattern. The project demonstrates two versions: one without using MediatR and another with MediatR.\n\n## Branches\n\n### Branch: `samples/without-mediatr`\n\nThis branch contains a simple implementation of CQRS without using the MediatR library.\n\n#### Movie.cs\n\n```csharp\nnamespace DemoCQRS.Data;\npublic class Movie\n{\n    public int Id { get; set; }\n    public string Name { get; set; }\n}\n```\n\n#### AppDbContext.cs\n\n```csharp\nnamespace DemoCQRS.Data;\npublic class AppDbContext : DbContext\n{\n    public AppDbContext(DbContextOptions\u003cAppDbContext\u003e options) : base(options) { }\n    public DbSet\u003cMovie\u003e Movies { get; set; }\n}\n```\n\n#### MovieController.cs\n\n```csharp\nnamespace DemoCQRS.Controllers;\n[Route(\"api/[controller]\")]\n[ApiController]\npublic class MovieController : ControllerBase\n{\n    private readonly AppDbContext _context;\n\n    public MovieController(AppDbContext context)\n    {\n        _context = context;\n    }\n\n    [HttpPost]\n    public async Task\u003cIActionResult\u003e Create(Movie movie)\n    {\n        _context.Movies.Add(movie);\n        await _context.SaveChangesAsync();\n        return Ok(movie.Id);\n    }\n\n    [HttpGet(\"{id}\")]\n    public async Task\u003cIActionResult\u003e Get(int id)\n    {\n        var movie = await _context.Movies.FindAsync(id);\n        return Ok(movie);\n    }\n}\n```\n\n#### Program.cs\n\n```csharp\nbuilder.Services.AddDbContext\u003cAppDbContext\u003e(options =\u003e options.UseInMemoryDatabase(\"AppDb\"));\n```\n\n### Branch: `master`\n\nThis branch includes the implementation of CQRS using the MediatR library.\n\n#### Program.cs\n\n```csharp\n// Add MediatR services\nbuilder.Services.AddMediatR(configuration =\u003e\n{\n    configuration.RegisterServicesFromAssembly(typeof(Program).Assembly);\n});\n```\n\n#### CreateMovieCommand.cs\n\n```csharp\nnamespace DemoCQRS.Features.Movies.Commands;\npublic sealed record CreateMovieCommand(string Name) : IRequest\u003cint\u003e;\n```\n\n#### CreatePlayerCommandHandler.cs\n\n```csharp\nnamespace DemoCQRS.Features.Movies.Commands;\npublic sealed class CreatePlayerCommandHandler : IRequestHandler\u003cCreateMovieCommand, int\u003e\n{\n    private readonly AppDbContext _context;\n\n    public CreatePlayerCommandHandler(AppDbContext context)\n    {\n        _context = context;\n    }\n\n    public async Task\u003cint\u003e Handle(CreateMovieCommand request, CancellationToken cancellationToken)\n    {\n        var movie = new Movie() { Name = request.Name };\n        _context.Movies.Add(movie);\n        await _context.SaveChangesAsync();\n        return movie.Id;\n    }\n}\n```\n\n#### GetMovieByIdQuery.cs\n\n```csharp\nnamespace DemoCQRS.Features.Movies.Queries;\npublic sealed record GetMovieByIdQuery(int Id): IRequest\u003cMovie?\u003e;\n```\n\n#### GetMoviePlayerByIdQueryHandler.cs\n\n```csharp\nnamespace DemoCQRS.Features.Movies.Queries;\npublic sealed class GetMoviePlayerByIdQueryHandler : IRequestHandler\u003cGetMovieByIdQuery, Movie?\u003e\n{\n    private readonly AppDbContext _context;\n\n    public GetMoviePlayerByIdQueryHandler(AppDbContext context)\n    {\n        _context = context;\n    }\n\n    public async Task\u003cMovie?\u003e Handle(GetMovieByIdQuery request, CancellationToken cancellationToken)\n    {\n        var movie = await _context.Movies.FindAsync(request.Id);\n        return (movie);\n    }\n}\n```\n\n#### MovieWithMediatRController.cs\n\n```csharp\nnamespace DemoCQRS.Controllers;\n\n[Route(\"api/[controller]\")]\n[ApiController]\npublic class MovieWithMediatRController : ControllerBase\n{\n    private readonly ISender _sender;\n\n    public MovieWithMediatRController(ISender sender)\n    {\n        _sender = sender;\n    }\n\n    [HttpPost]\n    public async Task\u003cIActionResult\u003e Create(CreateMovieCommand command)     \n    {\n        var movieId = await _sender.Send(command);\n        return Ok(movieId);\n    }\n\n    [HttpGet(\"{id}\")]\n    public async Task\u003cIActionResult\u003e Get(int id)\n    {\n        var movie = await _sender.Send(new GetMovieByIdQuery(id));\n        if(movie == null) \n            return NotFound();\n\n        return Ok(movie);\n    }\n}\n```\n\n## Setup Instructions\n\n1. Clone the repository:\n   ```bash\n   git clone \u003crepository-url\u003e\n   ```\n2. Switch to the desired branch:\n   ```bash\n   git checkout \u003cbranch-name\u003e\n   ```\n3. Restore the dependencies:\n   ```bash\n   dotnet restore\n   ```\n4. Run the application:\n   ```bash\n   dotnet run\n   ```\n\n## Summary\n\nThis project demonstrates how to implement CQRS in an ASP.NET Web API project, with and without the MediatR library. Each branch contains a complete example, allowing for a direct comparison between the two approaches.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmanusoft%2Fdemocqrs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmanusoft%2Fdemocqrs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmanusoft%2Fdemocqrs/lists"}