mirror of
https://github.com/wiremock/WireMock.Net.git
synced 2026-03-23 01:29:05 +01:00
5.1 KiB
5.1 KiB
WebSocket Builder Reorganization - Complete
✅ Changes Made
The IWebSocketResponseBuilder interface has been moved and reorganized to follow the WireMock.Net architecture patterns correctly.
Before ❌
- Location:
src/WireMock.Net.Abstractions/BuilderExtensions/IWebSocketResponseBuilder.cs - Returned:
IWebSocketResponseBuilder(not chainable with other builders) - Pattern: Isolated builder (didn't integrate with response builder chain)
After ✅
- Location:
src/WireMock.Net.Shared/ResponseBuilders/IWebSocketResponseBuilder.cs - Returns:
IResponseBuilder(chainable with all other builders) - Pattern: Follows
ICallbackResponseBuildermodel for consistency
🔧 Architecture Improvement
New Chainable Pattern
Now you can seamlessly chain WebSocket builder with other response methods:
// ✅ NEW: Fully chainable with other response methods
Response.Create()
.WithWebSocket(ws => ws
.WithMessage("Hello")
.WithJsonMessage(new { status = "ready" })
.WithTransformer()
.WithClose(1000)
)
.WithStatusCode(200) // Back to response builder!
.WithHeader("X-Custom", "value")
.WithDelay(TimeSpan.FromMilliseconds(100));
Builder Flow
IResponseBuilder.WithWebSocket()
↓
Creates WebSocketResponseBuilder with reference to parent IResponseBuilder
↓
Each WebSocket method returns the parent IResponseBuilder
↓
Allows chaining back to other response methods
↓
Complete fluent chain!
📂 File Changes
Moved
- ❌ Deleted:
src/WireMock.Net.Abstractions/BuilderExtensions/IWebSocketResponseBuilder.cs - ✅ Created:
src/WireMock.Net.Shared/ResponseBuilders/IWebSocketResponseBuilder.cs
Updated
-
✅
src/WireMock.Net.Minimal/ResponseBuilders/WebSocketResponseBuilder.cs- Now accepts
IResponseBuilderin constructor - Returns
IResponseBuilderfrom all methods - Maintains reference to parent builder for chaining
- Now accepts
-
✅
src/WireMock.Net.Minimal/ResponseBuilders/Response.WithWebSocket.cs- Updated to use new chainable pattern
- Creates WebSocketResponseBuilder with
thisreference - Correctly returns builder for method chaining
💡 Why This Matters
Consistency
- Follows the same pattern as
ICallbackResponseBuilder - All response builders in
WireMock.Net.Sharedfollow this pattern - Developers familiar with WireMock.Net patterns will recognize it immediately
Flexibility
- Users can mix WebSocket configuration with other response settings
- No longer limited to WebSocket-only chains
- Better integration with response builder ecosystem
Cleaner Architecture
- Interfaces in
WireMock.Net.Sharedare implementation-agnostic - Models stay in
WireMock.Net.Abstractions(IWebSocketMessage, IWebSocketResponse) - Builders stay in
WireMock.Net.Shared(IWebSocketResponseBuilder) - Implementations stay in
WireMock.Net.Minimal
🎯 Namespace Organization
WireMock.Net.Abstractions
Models/
├─ IWebSocketMessage.cs (Message interface)
└─ IWebSocketResponse.cs (Response interface)
WireMock.Net.Shared
ResponseBuilders/
├─ ICallbackResponseBuilder.cs (Callback builder)
├─ IWebSocketResponseBuilder.cs (WebSocket builder) ✅ NEW
└─ ...other builders
WireMock.Net.Minimal
ResponseBuilders/
├─ WebSocketMessage.cs (Implementation)
├─ WebSocketResponse.cs (Implementation)
├─ WebSocketResponseBuilder.cs (Implementation)
└─ Response.WithWebSocket.cs (Extension)
RequestBuilders/
└─ Request.WithWebSocket.cs (Extension)
✅ Compilation Status
- ✅
IWebSocketResponseBuilder.cs- 0 errors - ✅
WebSocketResponseBuilder.cs- 0 errors - ✅
Response.WithWebSocket.cs- 0 errors
All files compile successfully with the new chainable pattern!
📝 Usage Example
// Complete chainable WebSocket configuration
var mapping = Request.Create()
.WithWebSocketPath("/api/stream")
.WithWebSocketSubprotocol("v1")
.RespondWith(Response.Create()
.WithWebSocket(ws => ws
.WithMessage("Starting stream")
.WithMessage("Data chunk 1", delayMs: 100)
.WithMessage("Data chunk 2", delayMs: 200)
.WithJsonMessage(new { status = "complete" }, delayMs: 300)
.WithTransformer(TransformerType.Handlebars)
.WithClose(1000, "Stream complete")
)
.WithStatusCode(101) // ✅ Can chain other methods
.WithHeader("Sec-WebSocket-Accept", "*")
);
🚀 Summary
| Aspect | Before | After |
|---|---|---|
| Location | Abstractions | Shared |
| Chainability | ❌ Returns IWebSocketResponseBuilder | ✅ Returns IResponseBuilder |
| Pattern | Isolated | Integrated (like ICallbackResponseBuilder) |
| Flexibility | Limited | ✅ Full fluent chain support |
| Architecture | Non-standard | ✅ Follows WireMock.Net conventions |
Status: ✅ Complete and Verified
The WebSocket builder now follows WireMock.Net architecture best practices with full chainable support!