2013-01-03 316 views
3

我一直在这方面有点麻烦。NServiceBus依赖注入

AndreasÖhlund回答了一个关于它的问题here,但是我一直无法使用他给出的建议让它工作。

这里是我的设置:

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. 
    } 
} 

的想法是特定命令处理程序重写OnProcess方法和做他们的事,那么DomainRepository将节省一切。

下面是我注册的组件:

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); 
    } 
} 

这些都是下降了由DomainRepository使用的链中的所有对象;但是,当我收到命令时,DomainRepository为空。如果我注释掉注册DomainRepository需要的对象的行,我实际上会得到一个错误,说它无法创建它(Autofac DependencyResolutionException)。

应该注意的是,所有其他对象都使用构造函数注入(它们来自先前存在的项目)。我试图改变他们使用公共财产注入,但它没有任何区别。

如果有人能指出我在这里做错了,我们将不胜感激!

回答

7

将init方法中的代码移动到实现INeedInitialization的不同类中。在那里,使用Configure.Instance而不是Configure.With(),而不是Configure.Instance.DefaultBuilder()。

+0

非常棒 - 完成了这个诀窍!谢谢! – jacderida