2013-01-03 3 views
3

J'ai eu quelques problèmes avec cela.Injection de dépendances NServiceBus

Andreas Öhlund a répondu à une question à ce sujet here, mais j'ai été incapable de le faire fonctionner en utilisant les conseils qu'il m'a donnés.

Voici ma configuration:

public abstract class CommandHandler<T> : IHandleMessages<T>, IDomainReadRepository where T : Command 
{ 
    public IDomainRepository DomainRepository { get; set; } 

    protected abstract void OnProcess(T command); 

    public TAggregate GetById<TAggregate>(Guid id) where TAggregate : IEventProvider, new() 
    { 
     return DomainRepository.GetById<TAggregate>(id); 
    } 

    public void Handle(T message) 
    { 
     OnProcess(message); 
     // Domain repository will save. 
    } 
} 

L'idée est des gestionnaires de commandes spécifiques substituez la méthode OnProcess et faire leur chose, le DomainRepository va tout sauver.

Voici comment je me suis inscrit les composants:

public class EndpointConfig : IConfigureThisEndpoint, AsA_Server, IWantCustomInitialization 
{ 
    public void Init() 
    { 
     Configure.With().DefiningCommandsAs(c => c.Namespace != null && c.Namespace.EndsWith("Commands")); 
     Configure.Instance.DefaultBuilder().Configurer.ConfigureComponent<DomainRepository>(DependencyLifecycle.InstancePerCall); 
     Configure.Instance.DefaultBuilder().Configurer.ConfigureComponent<EventStore.Sql.EventStore>(DependencyLifecycle.InstancePerCall); 
     Configure.Instance.DefaultBuilder().Configurer.ConfigureComponent<MongoDbObjectSecurityDescriptorRepository>(DependencyLifecycle.InstancePerCall); 
     Configure.Instance.DefaultBuilder().Configurer.ConfigureComponent<LocalTenantConfig>(DependencyLifecycle.InstancePerCall); 
    } 
} 

Ce sont tous les objets en bas de la chaîne qui sont utilisés par le DomainRepository; cependant, quand je reçois une commande, le DomainRepository est nul. Si je commente les lignes pour enregistrer les objets dont DomainRepository a besoin, j'obtiendrai une erreur indiquant qu'il n'a pas réussi à le créer (Autofac DependencyResolutionException).

Il est à noter que tous les autres objets utilisent l'injection de constructeurs (ils proviennent d'un projet existant). J'ai essayé de les changer pour utiliser l'injection de propriété publique, mais cela n'a fait aucune différence.

Ce serait très apprécié si quelqu'un pouvait signaler ce que je fais mal ici!

Répondre

7

Déplacez le code dans votre méthode init dans une classe différente qui implémente INeedInitialization. Dans là, utilisez Configure.Instance au lieu de Configure.With() et aussi à la place de Configure.Instance.DefaultBuilder().

+0

Superbe - ça a fait l'affaire! Merci! – jacderida