容器不处理瞬态组件

时间:2013-06-13 10:47:27

标签: c# nhibernate castle-windsor nservicebus

我不确定这是更多的NServiceBus问题,Windsor问题,还是仅仅是我自己的愚蠢问题 - 但我遇到了内存泄漏,这似乎仍然指向许多瞬态组件闲逛。

这就是我在IWantCustomInitialization.Init方法中使用Windsor设置NServiceBus的方法:

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组件潜伏在周围,据我所见,只有保留这些组件的东西是Windsor容器(所以,据推测,它仍然认为其他东西正在使用这些组件?

我的一些问题可能源于NServiceBus负责在容器中注册某些组件和/或执行解决方案,因此我无法清楚地看到注册是否正确。

我的注册中是否存在错误/愚蠢的行为?

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

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

因为NServiceBus在容器中注册了一个ISessionFactory以供IFindSagas实现使用。但我有另一个实现IWantToRunWhenTheBusStarts的组件想要获得&#34; ABC&#34; ISessionFactory,我无法解决如何在NServiceBus和Windsor之间进行工作的问题。

期望注入ABCDataLookup个实例的其他组件是Sagas,而且我再也无法真正看到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>

1 个答案:

答案 0 :(得分:1)

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

ISessionFactory也应该作为UoW实施,请参阅我们的内部实施灵感here