スキル cqs-patterns
📦

cqs-patterns

安全

CQS- und CQRS-Muster anwenden

Clean Architecture erfordert eine klare Trennung zwischen Operationen, die den Zustand ändern, und solchen, die Daten zurückgeben. Dieser Skill bietet Muster und Codebeispiele für die Implementierung von Command Query Separation und CQRS in .NET-Anwendungen.

対応: Claude Codex Code(CC)
📊 69 十分
1

スキルZIPをダウンロード

2

Claudeでアップロード

設定 → 機能 → スキル → スキルをアップロードへ移動

3

オンにして利用開始

テストする

「cqs-patterns」を使用しています。 Konvertiere diese Methode zu CQS: ```csharp public Order GetAndProcessOrder(int orderId) { var order = _repository.GetById(orderId); order.Process(); _repository.Update(order); return order; } ```

期待される結果:

## CQS-konforme Refaktorierung

**Commands (Zustandsänderung):**
```csharp
public void ProcessOrder(int orderId)
{
var order = _repository.GetById(orderId);
order.Process();
_repository.Update(order);
}
```

**Queries (Datenabruf):**
```csharp
public Order? GetOrder(int orderId)
{
return _repository.GetById(orderId);
}
```

**Verwendung:**
```csharp
var order = orderService.GetOrder(orderId);
orderService.ProcessOrder(orderId);
```

「cqs-patterns」を使用しています。 Erstelle einen Command für die Aktualisierung des Bestellstatus

期待される結果:

## Update Order Status Command

```csharp
public record UpdateOrderStatusCommand(
Guid OrderId,
OrderStatus NewStatus,
string? Reason = null
) : ICommand;

public class UpdateOrderStatusCommandHandler
: ICommandHandler<UpdateOrderStatusCommand>
{
private readonly IOrderRepository _repository;
private readonly IEventPublisher _publisher;

public async Task HandleAsync(UpdateOrderStatusCommand command,
CancellationToken ct)
{
var order = await _repository.GetByIdAsync(command.OrderId, ct);
if (order == null)
throw new OrderNotFoundException(command.OrderId);

order.UpdateStatus(command.NewStatus, command.Reason);
await _repository.UpdateAsync(order, ct);
await _publisher.PublishAsync(
new OrderStatusUpdatedEvent(order.Id, command.NewStatus), ct);
}
}
```

「cqs-patterns」を使用しています。 Wann sollte ich CQRS verwenden?

期待される結果:

## Wann CQRS verwendet werden sollte

**Gut geeignet für CQRS:**
- Komplexe Domänen mit unterschiedlichen Lese-/Schreibmustern
- Szenarien mit hohem Leseaufkommen und geringem Schreibaufkommen (Reporting-Dashboards)
- Systeme, die Audit-Trails für Schreiboperationen erfordern
- Event-Sourced-Systeme
- Microservices mit separaten Read-Replicas

**CQRS erhöht die Komplexität. Verwenden Sie einfacheres CQS, wenn:**
- Einfache CRUD-Operationen dominieren
- Lese- und Schreibmodelle ähnlich sind
- Kleines Team oder Projekt
- Konsistenz zwischen Lese- und Schreiboperationen kritisch ist

**Beginnen Sie mit CQS auf Methodenebene und entwickeln Sie dann zu CQRS weiter, wenn die Anforderungen es erfordern.**

セキュリティ監査

安全
v6 • 1/21/2026

All 60 static findings are false positives. The scanner misinterpreted documentation keywords (command, query), markdown code fences as backticks, and metadata fields as hardcoded URLs. The skill contains legitimate CQS/CQRS architectural documentation with C# code examples.

2
スキャンされたファイル
1,125
解析された行数
0
検出結果
6
総監査数
セキュリティ問題は見つかりませんでした
監査者: claude 監査履歴を表示 →

品質スコア

38
アーキテクチャ
100
保守性
87
コンテンツ
20
コミュニティ
100
セキュリティ
87
仕様準拠

作れるもの

Service-Layer-Methoden entwerfen

Bestehende Service-Methoden refaktorieren, um CQS-Prinzipien zu folgen und zustandsändernde Operationen von Datenabruf-Queries zu trennen.

Command/Query-Handler erstellen

Neue Command- und Query-Handler nach etablierten MediatR-artigen Mustern mit ordnungsgemäßer Async-Unterstützung erstellen.

Lese-/Schreibtrennung architektonisch gestalten

CQRS auf Architekturebene anwenden und separate Lese- und Schreibmodelle entwerfen, die für ihre spezifischen Belange optimiert sind.

これらのプロンプトを試す

Grundlegende CQS-Konvertierung
Konvertiere diese Methode, um CQS-Prinzipien zu folgen. Trenne sie in einen Command, der den Zustand ändert, und eine Query, die Daten zurückgibt:

```csharp
public User CreateAndReturnUser(string email, string name)
{
    var user = new User { Email = email, Name = name };
    _repository.Add(user);
    return user;
}
```
Command-Handler erstellen
Erstelle einen Command-Handler für die Erstellung einer Bestellung mit folgenden Anforderungen:
- Akzeptiere CreateOrderCommand mit CustomerId und OrderItems
- Validiere, dass der Kunde existiert
- Erstelle Order-Domain-Entity mit Items
- Persistiere im Repository
- Publiziere OrderCreatedEvent
- Gib Order-ID zurück
Query-Handler erstellen
Erstelle einen Query-Handler für den Abruf von Bestellungen nach Kunde mit Paginierung:
- Akzeptiere GetOrdersByCustomerQuery mit CustomerId, Page, PageSize
- Gib PagedResult<OrderSummaryDto> zurück
- Füge optimierte SQL-Query hinzu
- Behandle Berechnung der Gesamtanzahl
Vollständige CQRS-Architektur anwenden
Entwerfe eine CQRS-Implementierung für einen Produktkatalog mit folgenden Anforderungen:
- Separate Lese- und Schreibmodelle
- Commands: CreateProduct, UpdatePrice, DiscontinueProduct
- Queries: GetProduct, GetProductsByCategory, SearchProducts
- Verwende Dispatcher-Muster für Routing
- Berücksichtige, wann vollständiges CQRS Mehrwert gegenüber einfachem CQS bietet

ベストプラクティス

  • Commands auf eine einzelne Aktion fokussieren und Queries darauf konzentrieren, Daten ohne Seiteneffekte zurückzugeben
  • Marker-Interfaces (ICommand, IQuery) verwenden, um generische Dispatching-Muster zu ermöglichen
  • Commands validieren, bevor Domain-Modelle berührt werden, und schnell mit klaren Fehlermeldungen fehlschlagen
  • Lesemodelle (DTOs) von Schreibmodellen (Entities) trennen, um jedes für seinen Zweck zu optimieren

回避

  • Domain-Entities aus Query-Handlers zurückgeben bricht die Lese-/Schreibtrennung
  • Geschäftslogik in Commands statt in Domain-Modellen hinzufügen verringert die Testbarkeit
  • Dasselbe Modell für Lese- und Schreiboperationen verwenden, wenn sich die Optimierungsanforderungen unterscheiden
  • CQRS einheitlich anwenden, wenn einfachere Muster ausreichen würden, fügt unnötige Komplexität hinzu

よくある質問

Was ist der Unterschied zwischen CQS und CQRS?
CQS gilt auf Methodenebene - jede Methode ändert entweder den Zustand oder gibt Daten zurück. CQRS gilt auf Architekturebene - mit vollständig getrennten Modellen, Handlers und Datenbanken für Lese- und Schreiboperationen.
Kann ein Command einen Wert zurückgeben?
Commands sollten void zurückgeben, aber die Rückgabe einer ID oder eines Identifiers ist akzeptabel, da sie die erstellte Ressource identifiziert, anstatt Query-Daten bereitzustellen.
Wann ist CQRS übertrieben?
CQRS erhöht die Komplexität. Verwenden Sie einfaches CQS für CRUD-Anwendungen, kleine Projekte oder wenn Lese-/Schreibmuster ähnlich sind. Entwickeln Sie zu CQRS weiter, wenn Sie unterschiedliche Optimierungsanforderungen haben.
Wie teste ich CQS-konformen Code?
Commands und Queries sind isoliert gut testbar. Mocken Sie das Repository für Command-Tests (Interaktionen verifizieren) und für Query-Tests (Testdaten bereitstellen).
Sollte ich dieselbe Datenbank für Lese- und Schreiboperationen verwenden?
Beginnen Sie mit derselben Datenbank. CQRS erlaubt, aber erfordert nicht separate Lesedatenbanken. Führen Sie Read-Replicas nur ein, wenn die Performance es erfordert.
Was ist das Dispatcher-Muster?
Der Dispatcher verwendet Reflection, um Commands und Queries basierend auf dem Typ an ihre Handler zu routen. Dies hält Controller schlank und fügt null Boilerplate pro Handler hinzu.

開発者の詳細

ファイル構成

📄 SKILL.md