【问题标题】:nservicebus saga property injection with ninject使用 ninject 进行 nservicebus saga 属性注入
【发布时间】:2012-04-20 04:09:58
【问题描述】:

我在配置 NSB 时使用了 ninject。以下是我的注册方式:

public class EndpointConfig : IConfigureThisEndpoint, AsA_Publisher, IWantCustomInitialization
{
    #region Implementation of IWantCustomInitialization

    public void Init()
    {
        var kernel = new StandardKernel();

        Configure.With().NinjectBuilder(kernel);

        kernel.Load(new BackendModule());
    }

    #endregion
}
public class BackendModule : NinjectModule
{
    #region Overrides of NinjectModule

    /// <summary>
    /// Loads the module into the kernel.
    /// </summary>
    public override void Load()
    {
        Bind<IEventBus>().To<NsbBus>();
        Bind<IRecordStorageConfig>().To<RegistrationEventStorageConfig>();
        Bind<IRecordStorage>().To<RegistrationRecordStorage>();
        Bind<IRecordStorageFactory>().To<RegistrationRecordStorageFactory>();
        Bind<IAggregateRootFactory>().To<RegistrationFactory>();
    }

    #endregion
}

我需要传奇中的 IAggregateRootFactory。

public class RegistrationSaga : Saga<RegistrationSagaData>,
                                IAmStartedByMessages<StartRegistration>,
                                IHandleMessages<CreateRegistration>,
                                IHandleMessages<ValidateRegistration>,
                                IHandleMessages<CancelRegistration>
{
    public RegistrationFactory Factory { get; set; }

    // removed implementation
}

saga 成功启动,命令是处理程序被调用。但是 IAggregateRootFactory 属性注入不起作用。工厂始终为空。我是不是接线错了?

【问题讨论】:

  • NsbBus 只是一个包装器,看起来像这样: public class NsbBus : IEventBus { private readonly IBus m_nsb;公共 NsbBus(IBus nsb) { m_nsb = nsb; } #region IEventBus 的实现 public void Publish(T @event) where T : class, IEvent { m_nsb.Publish(@event); } public void PublishAll(IEnumerable events) where T : class, IEvent { foreach (var @event in events) m_nsb.Publish(@event); } #endregion }
  • 我改用 Autofac 并注册了那个工厂,但是工厂在传奇中仍然是空的......

标签: ninject nservicebus cqrs


【解决方案1】:

我不太清楚为什么您的 saga 需要在其中包含 RegistrationFactory/IAggregateRootFactory,但这可能不是一个好主意。

【讨论】:

  • 该工厂将命令传递给 AR。传奇中的处理程序会执行类似 Factory.ExecuteStoreDispatch(someCommand) 的操作。代码在这里。 paste2.org/p/1986273
  • 我认为你正试图将逻辑从传奇中移到其他东西(你称之为聚合根)。我不确定我是否看到这样做的价值。
  • 逻辑保留在 AR 中。 Saga 只是将命令定向到 AR,AR 将应用该命令结果中的事件来更改其状态。佐贺保持清洁。如果这不是 sagas 的正确用法,请纠正我。
  • Udi 的另一件事,除了使用工厂之外,有什么想法可以解释为什么 Ninject 不能用于属性注入或 ctor 注入?
  • 我确实听说过有关 Ninject 的问题,特别是在属性注入方面。如果您只想将命令路由到其他对象,那么您应该使用常规消息处理程序 - 而不是 saga。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
  • 2011-03-10
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多