Behaviors and Commands

Behaviors and Commands

The Matrix Framework uses behaviors to define how services react to messages and commands to encapsulate service operations.

Service Behaviors

Message Handlers

Define how services respond to messages:

<ServiceNode Name="OrderProcessor">
    <ServiceNode.Behaviors>
        <!-- Handle order creation -->
        <MessageBehavior Path="/orders/create">
            <OnMessage>
                <ValidateMessage />
                <ProcessOrder />
                <NotifySuccess Path="/orders/created" />
            </OnMessage>
        </MessageBehavior>
        
        <!-- Handle order updates -->
        <MessageBehavior Path="/orders/update">
            <OnMessage>
                <ValidateUpdate />
                <UpdateOrder />
                <NotifyUpdate Path="/orders/updated" />
            </OnMessage>
        </MessageBehavior>
    </ServiceNode.Behaviors>
</ServiceNode>

State Behaviors

React to state changes:

<ServiceNode Name="InventoryManager">
    <ServiceNode.Behaviors>
        <!-- Monitor stock levels -->
        <StateBehavior Property="StockLevels">
            <OnChanged>
                <CheckThresholds />
                <TriggerReplenishment When="@level < @threshold" />
                <NotifyLowStock When="@level < @minimum" />
            </OnChanged>
        </StateBehavior>
        
        <!-- Track order status -->
        <StateBehavior Property="OrderStatus">
            <OnChanged>
                <ValidateTransition />
                <UpdateMetrics />
                <NotifyStatusChange Path="/orders/status" />
            </OnChanged>
        </StateBehavior>
    </ServiceNode.Behaviors>
</ServiceNode>

Service Commands

Command Definition

Define operations that can be invoked:

<ServiceNode Name="OrderManager">
    <ServiceNode.Commands>
        <!-- Create order command -->
        <Command Name="CreateOrder">
            <Parameters>
                <Parameter Name="CustomerId" Type="string" />
                <Parameter Name="Items" Type="List<OrderItem>" />
            </Parameters>
            
            <Validation>
                <Required Path="CustomerId" />
                <NotEmpty Path="Items" />
                <Custom Path="Items" 
                        Rule="@item.Quantity > 0" />
            </Validation>
            
            <Execution>
                <CreateOrderEntity />
                <ValidateInventory />
                <ReserveStock />
                <NotifyCreated />
            </Execution>
        </Command>
        
        <!-- Cancel order command -->
        <Command Name="CancelOrder">
            <Parameters>
                <Parameter Name="OrderId" Type="string" />
                <Parameter Name="Reason" Type="string" />
            </Parameters>
            
            <Authorization>
                <RequireRole Role="OrderManager" />
                <RequireOwnership Resource="@OrderId" />
            </Authorization>
            
            <Execution>
                <ValidateOrderState />
                <ReleaseStock />
                <UpdateOrderStatus Status="Cancelled" />
                <NotifyCancelled />
            </Execution>
        </Command>
    </ServiceNode.Commands>
</ServiceNode>

Command Binding

Bind commands to messages:

<ServiceNode Name="OrderAPI">
    <ServiceNode.Bindings>
        <!-- Bind HTTP endpoints to commands -->
        <CommandBinding Path="/api/orders/create" 
                       Command="CreateOrder">
            <ParameterMapping>
                <Map Source="body.customer_id" 
                     Target="CustomerId" />
                <Map Source="body.items" 
                     Target="Items" />
            </ParameterMapping>
        </CommandBinding>
        
        <!-- Bind message to command -->
        <CommandBinding Path="/orders/cancel" 
                       Command="CancelOrder">
            <ParameterMapping>
                <Map Source="message.order_id" 
                     Target="OrderId" />
                <Map Source="message.reason" 
                     Target="Reason" />
            </ParameterMapping>
        </CommandBinding>
    </ServiceNode.Bindings>
</ServiceNode>

Behavior Composition

Behavior Chains

Combine behaviors for complex scenarios:

<ServiceNode Name="OrderProcessor">
    <ServiceNode.Behaviors>
        <!-- Order processing chain -->
        <BehaviorChain>
            <MessageBehavior Path="/orders/submit" />
            <ValidationBehavior />
            <AuthorizationBehavior />
            <TransactionBehavior />
            <MetricsBehavior />
            <LoggingBehavior />
        </BehaviorChain>
    </ServiceNode.Behaviors>
</ServiceNode>

Behavior Templates

Create reusable behavior patterns:

<Template Name="AuditedBehavior">
    <BehaviorChain>
        <LoggingBehavior Level="Info" />
        <MetricsBehavior />
        <AuditBehavior>
            <Track Property="Actor" />
            <Track Property="Action" />
            <Track Property="Resource" />
        </AuditBehavior>
    </BehaviorChain>
</Template>

<ServiceNode Name="OrderManager">
    <ServiceNode.Behaviors>
        <!-- Apply behavior template -->
        <ApplyTemplate Name="AuditedBehavior">
            <Track Property="OrderId" />
            <Track Property="Status" />
        </ApplyTemplate>
    </ServiceNode.Behaviors>
</ServiceNode>

Best Practices

  1. Behavior Design

    • Keep behaviors focused
    • Compose for complexity
    • Handle errors gracefully
    • Log behavior decisions
  2. Command Design

    • Validate inputs thoroughly
    • Enforce authorization
    • Maintain idempotency
    • Document parameters
  3. Composition

    • Use templates for reuse
    • Chain behaviors logically
    • Monitor performance
    • Test combinations