gpt4 book ai didi

c# - 容器不处理 transient 组件

转载 作者:行者123 更新时间:2023-11-30 17:53:39 25 4
gpt4 key购买 nike

我不确定这更多的是 NServiceBus 问题、Windsor 问题,还是我自己的愚蠢问题——但我遇到了内存泄漏,这似乎表明仍有许多 transient 组件存在。

这就是我在 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 在容器中注册了一个 ISessionFactoryIFindSagas 实现使用。但是我有另一个实现 IWantToRunWhenTheBusStarts 的组件想要获取“ABC”ISessionFactory,但我不知道如何在 NServiceBus 和 Windsor 之间实现它。

期望注入(inject) 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>

最佳答案

我们已经修复了很多与 v4 中正确处理组件有关的问题,请参阅 https://github.com/NServiceBus/NServiceBus/commit/baa9624517d1083e3cfa681e8598f66ccfbf741b

ISessionFactory 也应作为 UoW 实现,请参阅我们的内部实现以获得灵感 here

关于c# - 容器不处理 transient 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17085115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com