我不确定这更多的是 NServiceBus 问题、Windsor 问题还是我自己的愚蠢问题 - 但我遇到了内存泄漏,这似乎表明许多临时组件仍然存在。
这就是我在方法中使用 Windsor 设置 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));
因为 NServiceBusISessionFactory
在容器中注册了一个以供IFindSagas
实现使用。但是我有另一个实现IWantToRunWhenTheBusStarts
想要获得 "ABC" 的组件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>