2

我想将默认IDataBus实现(写入文件系统)替换为写入数据库的实现(以便它可以在 AWS 上运行)。为此,我有一个配置扩展:

public static class ConfigureSqlServerDataBus
{
    public static Configure SqlServerDataBus(this Configure config)
    {
        var dataBus = new SqlServerDataBus();
        config.Configurer.RegisterSingleton<IDataBus>(dataBus);
        return config;
    }
}

允许我配置总线。但显然我SqlServerDataBus依赖于告诉它在哪里写的东西(IRepository在这种情况下是一个实现)。

通常我会通过构造函数请求依赖关系,但是由于服务总线的配置是通过IWantCustomInitialization将用于Activator创建实例的我完成的,所以我不能。我的理解是 NServiceBus 将使用属性注入来满足依赖关系,但它似乎没有这样做。配置完成后,我有几个这样的电话:

Configure
.With()
.DefineEndpointName("SomeName")
.DefaultBuilder()
.DBSubcriptionStorage()
.XmlSerializer()
.SqlServerDataBus()
.MsmqTransport()
    .IsTransactional(true)
.UnicastBus()
.LoadMessageHandlers()
.CreateBus()
.Start(() => Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install());


Configure.Instance.Configurer.ConfigureComponent<RepositoryImplementation>(ComponentCallModelEnum.None);
Configure.Instance.Configurer.ConfigureComponent<SqlServerDataBus>(ComponentCallModelEnum.None);

但是我的 setterSqlServerDataBus永远不会被调用,尽管 Put 方法是。

有人可以指出我做错了什么吗?

4

1 回答 1

4

总线启动后,您无法更改配置。要将配置调用移动到流畅的初始化代码中,请使用 RunCustomAction 方法。

或者,您可以编写一个实现 INeedInitialization 的新类并在其中进行配置调用。这个类将在正确的时间被调用。

于 2012-07-13T19:32:38.540 回答