容器不处理瞬态组件

本文关键字:组件 处理 | 更新日期: 2023-09-27 18:18:06

我不确定这是NServiceBus问题,温莎问题,还是只是我自己的愚蠢问题-但我正在经历内存泄漏,似乎指向许多瞬态组件仍然挂在周围。

这是我如何设置NServiceBus与温莎,在我的IWantCustomInitialization.Init方法:

var cont = new Castle.Windsor.WindsorContainer();
cont.Register(
    Component.For<IWindsorContainer>().Instance(cont));     
Configure.With()
    .CastleWindsorBuilder(cont)
    .DefiningCommandsAs(t => t.GetCustomAttributes(typeof(MyCommandAttribute), false).GetLength(0) > 0)
    .DefiningEventsAs(t => t.GetCustomAttributes(typeof(MyEventAttribute), false).GetLength(0) > 0)
    .DefiningMessagesAs(t => t.Namespace != null && t.Namespace.EndsWith(".LocalMessages"))
    .XmlSerializer()
    .Log4Net()
    .IsolationLevel(System.Transactions.IsolationLevel.ReadCommitted)
    .UseNHibernateTimeoutPersister()
    .RunTimeoutManager()
    .Sagas()
    .NHibernateSagaPersister()
    .DisableRavenInstall();
cont.Register(
    Component.For<ISessionFactory>().Named("ABC").LifeStyle.Singleton.UsingFactoryMethod(() =>
{
    return Fluently.Configure().Database(() =>
        {
            return MsSqlConfiguration.MsSql2005.UseOuterJoin()
            .ConnectionString(x => x.FromConnectionStringWithKey("ABCData"))
            .ShowSql();
        }
    ).Mappings((m) =>
        {
            AddABCMappingsOnly(m.FluentMappings);
        })
    .ExposeConfiguration(cfg =>
        {
            SchemaMetadataUpdater.QuoteTableAndColumns(cfg);
            var sv = new SchemaValidator(cfg);
            sv.Validate();
        })
    .BuildSessionFactory();
}));
cont.Register(
    Component.For(typeof(IClientLookup), typeof(ICountryLookup), typeof(IOtherLookupLookup)).LifeStyle.Transient.ImplementedBy<ABCDataLookup>().DependsOn(
Dependency.OnComponent(typeof(ISessionFactory), "ABC")));

我发现的是,经过一段时间的正常运行时间(说,2小时尽可能多地通过消息推送),我有成千上万的ABCDataLookup组件潜伏在周围,到目前为止,我可以看到,唯一保持这些组件的是温莎容器(所以,大概,它仍然认为其他东西正在使用这些组件?)

我的一些问题可能是由于NServiceBus负责在容器中注册一些组件和/或执行解析,所以我不能清楚地看到注册是否正确。

是否有什么我做错了/愚蠢在我的注册?

我已经不得不做一件看起来不对的事了:

cont.Register(
    Component.For<IWindsorContainer>().Instance(cont));

因为NServiceBus在容器中注册了一个ISessionFactoryIFindSagas实现使用。但是我有另一个实现IWantToRunWhenTheBusStarts的组件,它想获得"ABC"ISessionFactory,我不知道如何在NServiceBus和Windsor之间工作。

期望有ABCDataLookup实例注入的其他组件是saga,再一次,我不能真正看到NServiceBus是如何注册/实例化它们的。

如果有任何额外的代码或配置需要显示,请喊出来。

我Packages.config

:

<packages>
  <package id="Castle.Core" version="3.0.0.4001" targetFramework="net45" />
  <package id="Castle.Windsor" version="3.0.0.4001" targetFramework="net45" />
<!-- irrelevant -->
  <package id="FluentNHibernate" version="1.3.0.733" targetFramework="net45" />
  <package id="Iesi.Collections" version="3.2.0.4000" targetFramework="net45" />
  <package id="log4net" version="1.2.10" targetFramework="net45" />
<!-- irrelevant -->
  <package id="NHibernate" version="3.3.2.4000" targetFramework="net45" />
  <package id="NServiceBus" version="3.3.8" targetFramework="net45" />
  <package id="NServiceBus.CastleWindsor" version="3.3.8" targetFramework="net45" />
  <package id="NServiceBus.Host" version="3.3.8" targetFramework="net45" />
  <package id="NServiceBus.Interfaces" version="3.3.8" targetFramework="net45" />
  <package id="NServiceBus.NHibernate" version="3.3.8" targetFramework="net45" />
</packages>

容器不处理瞬态组件

我们已经修复了一些在v4中正确处理组件的事情,参见https://github.com/NServiceBus/NServiceBus/commit/baa9624517d1083e3cfa681e8598f66ccfbf741b

ISessionFactory也应该作为UoW实现,参见我们的内部实现在这里获得灵感