Magnus Mårtensson
Microsoft Regional Director, Azure MVP, CEO Loftysoft
Avirag Jain
Director & CTO R Systems
Mahesh Chand
Founder C# Corner, CEO Mindcracker
Chris Gali
CEO & Co-Founder Graphite
Subinder Khurana
Chief Architect StoryProcess, Founder NASSCOM DeepTech Club
Bryan Rishforth
Investor, Chairman Graphite
Bryn Everson
Director Biz Dev Graphite
Raj Tiwari
Digital Transformation Leader, Futurist and Visionary
Joseph Guadagno
Microsoft MVP, Lead Quicken Loans
Nikita Sachdev
Entrepreneur, Blockchain Enthusiast & Advisor, Social Media Influencer
Doug Wagner
COO & Founder Adapt Technical Group
Ritesh Modi
Architect, Senior Evangelist, Cloud Architect
Crystal Wenrick
Director Communications Mindcracker
Allen O’Neill
Microsoft MVP, Consulting Engineer/Architect
Praveen Kumar
CEO MCN Solutions
Chris Love
Founder Love2Dev, Microsoft MVP, Author
Sanjay Vyas
Microsoft Regional Director, Microsoft MVP, Founder & CEO SkillLabs Technologies
Veena Sarda
Deep Learning Consultant, Author
Sekhar Srinivasan
C# Corner MVP, Microsoft Certified Trainer, Pluralsight Author
Lalit Bansal
Founder & CEO - EIY SYS
Navdeep Garg
CEO Revinfotech
Prakash Tripathi
Tech Manager/Leader, Microsoft MVP, Blogger
Bhavna Jain
Breakthrough Consultant
Naveen Sharma
Enterprise Architect, Leadership Coach, Author
Vidya Vrat Agarwal
Principal Architect, Microsoft MVP, Author
Sheetal Agarwal
Founder Clownselors, Medical Clown, Trainer
Abhishek Kant
Founder GTM Catalyst
Vishnu Saran
Founder & CEO VoiceQube
Sandeep Soni
Founder & CEO Deccansoft, Microsoft Certified Trainer
Parveen Malik
AVP InfoSec & Vulnerability Management, Information Security Expert
Nitin Pandit
Microsoft MVP, Developer Evangelist, Author
Niloshima Srivastava
C# Corner MVP, Tech Architect, Trainer, Blogger
Bala Chirtsabesan
Senior Software Engineer at Microsoft, Author
Manoj Mittal
Sr. Technical Architect, C# Corner MVP, Author
Chandni Di
Co-Founder Voice of Slum
Vithal Wadje
Technical Lead, Microsoft MVP, Author
Shivam Ahuja
Founder SkillCircle, Business Mentor
Chervine Bhiwoo
Solution Architect, Microsoft MVP, Author
Saurabh Jain
Vice President Paytm, Founder Fun2Do Labs, Author
Vinay Solanki
Head IoT at Lenovo, Founder IoT-NCR
Anshu kumari
Founder Blockchainkids, Inventor, Trainer
Amit Singal
CEO Startup Buddy
Dev Pratap
Co-Founder & CEO Voice of Slum
Amey Vartak
Technology Consultant, Full Stack Developer, C# Corner MVP, Author
Viswanatha Swamy
Principal Software Engineer, C# Corner MVP, Author
Sanket Verma
Research Engineer @ Ballistics (Forensics) and Chair, PyData Delhi
Sourabh Somani
Lead Developer, Microsoft MVP, Author
Abhishek Mishra
Software Architect, C# Corner MVP, Author
Siddharth Vaghasia
Technical Consultant, C# Corner MVP, Blogger
Bassam Alugili
Senior Software Specialist, Database Expert
S Ravi Kumar
Solution Architect, C# Corner MVP, Author
Sundaram Subramanian
Full Stack Developer, C# Corner MVP, Speaker
Deepesh Somani
Solution Architect, Microsoft MVP, Author
Debasis Saha
Technical Project Manager, C# Corner MVP, Blogger, Author
Vipul Jain
Software Architect, C# Corner MVP, Author
Akshay Patel
Technical Architect, Microsoft Certified Trainer, C# Corner MVP, Author
Stephen Simon
RPA Developer, Evangelist, Author
Vivek Sharma
Founder Kingster636, AR/VR Specialist
Jeetendra Gund
Technical Lead, C# Corner MVP, Author
Sujal Beniwal
AI Enthusiast, Student
M Viknaraj
Microsoft MVP, Azure Architect, Author
Prasham Sabadra
Software Architect, C# Corner MVP, Trainer, Author
Aakash Maurya
Senior Developer, C# Corner MVP, Speaker
Ankit Sharma
Senior Software Engineer, C# Corner MVP, Author
Mangesh Gaherwar
Team Lead, C# Corner MVP, Author
Viral Jain
Technical Consultant, C# Corner MVP, Author
Bhasker Das
Solution Architect, Evangelist
Manish Dwivedi
Associate Project Manager
Ck Nitin
Programmer, Author
Rohit Gupta
Technical Trainer, Author
Manish Tewatia
Full-stack Marketer, UX Designer
Bhavya Gaur
Technical Illustrator
Rohit Tomar
SEO/SMO Expert
Web Track
Cloud & Data Track
Dev Track
Registration & Breakfast
Future of Desktop Apps with JS (ElectronJs)
Nitin Pandit
Building Serverless Microservices Using Microsoft Azure
Vithal Wadje
Innovating RPA: A Robot for Every Person
Stephen Simon
Managing Cloud Storage Accounts using Logic Apps
Viknaraj Manogararajah
Data visualization using Python
Sekhar Srinivasan
Going Cross platform with AR Foundation
Vivek Sharma
Keynote
Managing your Azure dependencies in ASP.NET Core apps using VS
Bala Chirtsabesan
Securing Applications on Intelligent Azure
Abhishek Mishra
Getting started with Blazor the Framework of Future
S Ravi Kumar
Lunch
Build Progressive Web Apps using Angular 9
Debasis Saha
Build and deploy to any platform using Azure DevOps
Chervine Bhiwoo
Deep Dive in Azure Service Bus
Akshay Patel
Build a Native Mobile Application using React Native and JavaScript
Joseph Guadagno
Making sense of Web Job, Web Job SDK and Functions in Azure
Prakash Tripathi
CloudFront Distribution in AWS
Viral Jain
Tea Break
Introduction to PowerBI
Aakash Maurya
Build Advanced SPFx solutions with React and Graph API
Siddharth Vaghasia
Build Business Intelligence Analyst (BIA) Skills
Sundaram Subramanian
Deep dive of Power Platform – AI BUILDER
Prasham Sabadra
Panel 1
What's new in SharePoint development
Vipul Jain
Build a SSO (Single Sign On) based Native JavaScript application with Microsoft Identity within 10 minutes
Manoj Mittal
Panel 2
Applications and working of AI
Veena Sarda
Deploying serverless API's with .Net core 3.0 on AWS & Azure
Amey Vartak
Panel 3
Blockchain with .NET Core (Ark)
Anshu Kumari
Closing Note & Prize Distribution
Dev Track
Cloud Track
Architecture Track
Emerging Tech Track
Registration & Breakfast
Creating Full-Stack Web Apps Using Server-Side Blazor
Ankit Sharma
Real time face recognition with MS Cognitive Services
Niloshima Srivastava
Building Scalable APIs with GraphQL
Jeetendra Gund
Future of development with AI and Blockchain
Navdeep Garg
Debugging Tips and Tricks with Visual Studio 2019
Joseph Guadagno
Azure Containers
Abhishek Kant
Enterprise Architecture
Naveen Sharma
Bot Framework - learn it fast and look like a boss!
Allen O’Neill
Keynote
.Net Core & C# 8 Performance
David McCarter
Working with Azure kubernetes services
Ritesh Modi
Becoming an Architect
Vidyavrat Agarwal
Why Techies Need to Learn Product Management
Saurabh Jain
Lunch
Build a rules engine in .Net Core
Sanjay Vyas
Building CI and CD Pipeline using Azure DevOps
Sandeep Soni
Entity Framework Core - Tips and Tricks, Performance Optimization, and Tuning
Bassam Alugili
Hacking your way into Data Science
Sanket Verma
Speed up your .Net Core Website
Sourabh Somani
Azure
Magnus Mårtensson
Demystifying Open Distro for Elasticsearch
Suman Debnath
Future of Data
Shivam Ahuja
Tea Break
gRPC with C# and .Net Core
Mangesh Gaherwar
Panel 1
Essentials of Cloud security
Parveen Malik
Power platform and Dynamics 365
Deepesh Somani
Microservices - the gRPC Way
Viswanatha Swamy
Panel 2
Reserved
Reserved
Closing Note & Prize Distribution
Implementing CQRS with MediatR in C# projects
As C# applications grow, a single service layer can become responsible for too many concerns. It may validate incoming data, coordinate several repositories, publish events, enforce permissions and shape responses for different screens. CQRS, or Command Query Responsibility Segregation, offers a clearer arrangement by separating operations that change state from operations that read it.
MediatR provides a lightweight in-process messaging pattern for this architecture. Commands and queries become focused request objects, while handlers contain the application behaviour for each use case. For teams building systems in Sydney, Melbourne, Brisbane or other Australian technology hubs, this approach can improve maintainability without requiring a distributed microservices platform from the first release.
Why CQRS suits growing C# systems
In a conventional CRUD application, a controller often calls a service that performs both reads and writes against the same domain model. This can work well for a small internal tool. As features expand, read models acquire joins and presentation-specific fields, while write operations become constrained by business rules. The resulting classes are difficult to test because a change for one use case can affect several unrelated paths.
CQRS divides those responsibilities. A command expresses an intention, such as RegisterCustomerCommand or ApproveInvoiceCommand, and changes application state. A query expresses a request for information, such as GetCustomerSummaryQuery, and should have no side effects. The separation does not require two databases. Many projects begin with one SQL Server database and separate handlers, then introduce specialised read stores only when performance or scale justifies it.
This structure is useful in Australian organisations where software frequently integrates with banking, logistics, healthcare or government systems. A customer command might enforce consent and audit requirements, while a query can return a fast dashboard projection without exposing the complete domain entity.
Shaping commands and queries
A request should represent a complete use case rather than a generic database operation. UpdateCustomerCommand is often too broad because different screens may be allowed to change different fields. More precise requests such as ChangeCustomerAddressCommand or SuspendAccountCommand make permissions, validation and auditing easier to understand.
A MediatR request commonly implements IRequest<TResponse>. Its handler implements IRequestHandler<TRequest, TResponse>, which gives the application a predictable entry point. The handler should coordinate domain objects and infrastructure through abstractions, rather than becoming a second controller or directly returning an Entity Framework Core entity.
For queries, response records or dedicated DTOs are usually safer than domain objects. They prevent accidental mutation and allow the SQL projection to match the client’s needs. A reporting query might use AsNoTracking() and select only the columns required by a React interface or a mobile application. This is especially valuable when users connect through variable NBN or mobile networks outside the major metropolitan areas.
Building a MediatR request pipeline
MediatR routes a request to one handler, but the pipeline can apply behaviour shared across many use cases. Common behaviours include FluentValidation checks, structured logging, performance timing, transaction management and idempotency. Register these behaviours in a deliberate order so that failures and metrics are consistent.
For example, a validation behaviour can locate all validators for the current request and return a useful error before the handler touches the database. A logging behaviour can record the request type, correlation ID and elapsed time without logging passwords or personal information. In an Australian production environment, this discipline supports responsible handling of personal data under the Privacy Act and helps teams investigate incidents across Azure services.
A transaction behaviour needs careful boundaries. It can wrap a command that writes several related records, but it should not automatically wrap every query or external API call. A transaction cannot roll back an email sent through a provider or a message already published to a third-party service. Where those actions matter, use an outbox record and publish the event after the database transaction succeeds.
Connecting handlers to persistence
A command handler should express application intent and delegate persistence details to suitable components. For example, CreateOrderCommandHandler can load a customer, ask the domain model to create an order, save changes and record an integration event. It should not contain large blocks of controller-style mapping, raw SQL and unrelated notification code.
Queries can use a different data access route from commands. Entity Framework Core is appropriate for many read cases, while Dapper or database views may be preferable for complex reporting. A read model can combine order, delivery and payment data into one response without forcing the domain model to mirror the shape of a screen.
CQRS also works well with analytics features. A retailer may use a query projection to provide customer activity to a machine-learning workflow, while commands continue to protect transactional rules. When planning predictive services, teams can review Azure churn modelling as an example of how customer data can support retention decisions without placing analytical queries inside transactional handlers.
Managing validation, errors and domain rules
Validation belongs at several levels, with each level serving a different purpose. Request validation can check required fields, formats and simple ranges. Domain rules should protect invariants that must hold regardless of the caller, such as preventing an order from being paid twice. Database constraints provide a final safeguard for uniqueness and referential integrity.
Handlers should translate expected failures into stable application results. A missing customer may become a not-found response, while a rejected business operation may produce a domain error with a code that the API can expose safely. Avoid catching every exception and returning a generic success-shaped response; it hides defects and makes operational diagnosis harder.
Australian systems often need to consider time zones and financial precision. Store timestamps in UTC, convert them for presentation in AEST, AEDT or another relevant zone, and use decimal values for money rather than floating-point numbers. For a payments or payroll workflow, explicitly define how daylight-saving changes in states such as New South Wales and Victoria affect scheduled commands.
Testing and operating the application
MediatR handlers are straightforward to unit test because each handler has a narrow input and output. Tests should verify business outcomes, rejected states and important side effects rather than checking every internal method call. Domain tests can run without a database, while integration tests can confirm EF Core mappings, transactions and query projections against a realistic database engine.
Pipeline behaviours deserve their own tests. Confirm that invalid requests do not reach the handler, transactions commit and roll back correctly, and logging omits sensitive fields. Contract tests can verify that API responses remain compatible with front-end clients, particularly when several teams release on different schedules.
Production monitoring should expose useful dimensions such as request type, duration, failure category and correlation ID. Avoid using raw customer identifiers in metric labels, since high-cardinality telemetry can become expensive and create privacy risks. In an Azure-hosted Australian workload, choose an appropriate local region where availability and data-residency requirements permit, and document how backups, failover and support access are handled.
Avoiding common CQRS mistakes
CQRS is not a requirement to create a separate service for every command. A modular monolith is often the most practical starting point: one deployable application, clear feature folders and an internal mediator. This keeps local development and deployment manageable while preserving boundaries that can later support extraction if a team or workload genuinely needs it.
Another mistake is creating handlers that are too thin to be meaningful. If every handler merely calls a generic repository method, the project has added ceremony without gaining useful separation. Conversely, a handler that performs validation, mapping, database access, messaging and five unrelated decisions should be split around explicit application responsibilities.
Avoid sharing one mutable DTO between commands and queries. Shared contracts can accidentally expose fields or permit updates that were never intended. Also avoid hiding every dependency behind a repository abstraction when EF Core already provides the required behaviour; abstractions should clarify a boundary, not obscure a simple query.
Choosing an approach for your project
The right design depends on business complexity, read/write imbalance and the cost of operational change. A small appointment application may need only conventional services. A platform with complex approvals, audit trails, multiple clients and reporting demands can gain substantial value from command-query separation and MediatR pipeline behaviours.
The following comparison helps position the options before implementation begins. It is usually sensible to introduce CQRS by feature, starting with a workflow that has clear business rules or noticeably different read and write needs.
| Approach | Best suited to | Main strengths | Main trade-offs |
|---|---|---|---|
| Conventional CRUD service | Small applications and simple administrative tools | Low ceremony and fast initial delivery | Services can become broad and difficult to change |
| CQRS with one database | Modular monoliths with growing business complexity | Clear use cases, focused handlers and easy incremental adoption | More classes and conventions to maintain |
| CQRS with separate read models | Reporting-heavy or high-volume read workloads | Optimised projections and independent read performance | Synchronisation, rebuilds and eventual consistency |
| CQRS with MediatR pipelines | Teams needing shared validation, logging and transaction policies | Cross-cutting behaviour is centralised and testable | Pipeline order and hidden behaviour require documentation |
| Event-driven CQRS | Systems requiring integration history or asynchronous workflows | Strong auditability and loose integration boundaries | Messaging operations, retries and consistency are harder |
A useful implementation sequence is to define one command and one query for a bounded feature, add request validators, create focused handlers, and test the resulting workflow end to end. Once the boundaries prove valuable, shared pipeline behaviours and read projections can be introduced with evidence rather than assumption. This keeps the architecture aligned with the needs of the product, its users and the Australian operating environment.
1, CBD, Maharaj Surajmal Road, Near Yamuna Sports Complex, Delhi, 110032
GENERAL QUERIES
Manish Tewatia
manish@csharpcon.com
+91-9718-431-042
TICKET QUERIES
Atul Gupta
conference@csharpcon.com
+91-9910-125-804