2011-08-10 4 views
3

Je tente d'injecter un objet dans ma saga. À l'aide du point de terminaison suivant, lorsque le message arrive à la méthode handle de la saga, la propriété est null.Injection de propriété NserviceBus

Le critère d'évaluation:

public class EndpointConfig : IConfigureThisEndpoint, AsA_Server, IWantToRunAtStartup 
     { 
      public void Run() 
      { 
       IOrderRepository orderRepository = new OrderRepository(); 
       Configure.Instance.Configurer.ConfigureProperty<CreateOrderSaga>(x => x.OrderRepository, orderRepository); 
      } 

// stop method removed 
    } 

Le app.config

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" /> 
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" /> 
    </configSections> 

    <MsmqTransportConfig 
    InputQueue="Fulfilment.CreateOrder.OrderRecievedMessage" 
    ErrorQueue="error" 
    NumberOfWorkerThreads="1" 
    MaxRetries="3" 
    /> 

    <UnicastBusConfig 
    DistributorControlAddress="" 
    DistributorDataAddress=""> 
    <MessageEndpointMappings> 
     <add Messages="NServiceBus.Saga.TimeoutMessage, NServiceBus" Endpoint="timeoutmanager" /> 
    </MessageEndpointMappings> 
    </UnicastBusConfig> 
</configuration> 

et mes Saga accepter des messages comme suit

public class CreateOrderSaga : Saga<CreateOrderSagaData>, 
      IAmStartedByMessages<OrderRecievedMessage>, 
      IHandleMessages<OrderCompletedMessage>, 
      IHandleMessages<OrderCancelledMessage> 
     { 
      public IOrderRepository OrderRepository { get; set; } 
      public void Handle(OrderRecievedMessage message) 
      { 
var order = new Order(); 
OrderRepository.SaveOrder(order); 
      } 

une expection de référence null sera lancée lors d'une tentative d'appeler SaveOrder(). Ai-je configuré l'injection de dépendance correctement?

Répondre

7

NServiceBus automatiquement faire l'injection de propriété pour vous afin que vous ne devez enregistrer votre dépôt avec le contenant:

Dans votre méthode Init(): (Mettre en œuvre IWantCustomInitialization sur une classe séparée)

Configure.Instance.ConfigureComponent<OrderRepository>([The lifecycle you want]); 

IWantToRunAtStartup est non destiné aux tâches de configuration (utilisez IWantCustomInitialization à la place)

+1

Brillant. Merci Andreas. Cela a fait l'affaire. – Adam

+3

Il y a maintenant une forme raccourcie avec seulement: Configure.Component (cycle de vie); –

Questions connexes