【问题标题】:Using transient factories in Castle Windsor在温莎城堡使用临时工厂
【发布时间】:2015-03-15 08:31:17
【问题描述】:

如果你使用Windsor中的TypedFactoryFacility基于接口为你生成工厂,工厂本身可以注册为Transient。事实证明,工厂将释放它在工厂本身释放后释放时创建的所有瞬态对象。

container.AddFacility<TypedFactoryFacility>();
container.Register(
    Types.FromThisAssembly().BasedOn<IFactory>().Configure(
        x => x.AsFactory()).LifestyleTransient());

这意味着,如果我将自动生成的工厂创建为瞬态,它可以让我巧妙地忘记 Releaseing 从工厂创建的对象(当然,只要我管理工厂本身的生命周期)。这种瞬态工厂的生命周期将与其他一些瞬态对象相关联,因此当该对象被释放时,工厂以及该工厂创建的所有内容都会被释放。

就我个人而言,我讨厌必须显式地记住Release() 对象,这会大大清理代码,所以这让我非常高兴。但问题是:这是合理的做法吗?这一切似乎太容易了。

每次需要工厂时都创建一个新的工厂实例有什么缺点吗?

我是在给自己挖一个可怕的坑吗?

【问题讨论】:

    标签: c# castle-windsor factory castle transient


    【解决方案1】:

    Castle 中的自动工厂机制是基于 Castle.DynamicProxy;我想如果您将工厂用作临时组件,则必须为每个分辨率创建 ProxyGenerator 付费,除非存在其他缓存机制。

    documentation 警告不要每次都重新创建 ProxyGenerator

    如果您有一个长时间运行的进程(网站、Windows 服务等) 你必须创建许多动态代理,你应该确保 重用相同的 ProxyGenerator 实例。如果没有,请注意您将 然后绕过缓存机制。副作用是高 CPU 使用率和 内存消耗不断增加

    但是,Windsor 中完全有可能存在某种机制来防止此问题,或者文档已过时。

    我的建议:在您的瞬态工厂分辨率上循环测试,然后解析您的组件;密切注意内存(也加载程序集;代理代码可能加载到侧程序集中)和处理器使用情况,以确定您的技巧是否可行

    【讨论】:

    • 好主意。这实际上是我担心的事情之一。我做了一些实验,检查生成的动态代理,并在调试器中运行一些测试......看起来代理函数只生成一次,所以在循环中创建和释放 20 亿个工厂不会扩展内存使用情况。不过,使用整个核心确实需要大约 2 分钟才能完成。我想我可以忍受这样的吞吐量。
    • Windsor 只保留了一个 PG 实例,所以这应该不是问题。
    • @HamiltonVerissimo 感谢您提供信息。我没有勇气去挖掘和检查自己,但使用一些长寿命的发电机听起来很合乎逻辑
    • 实际上,如果您想了解更多详细信息,Windsor 有自己的 PG,它在需要代理组件时使用它(拦截器!= 空),但像汽车工厂这样的设施可能会创建自己的。
    【解决方案2】:

    所以更深层次的问题与 IDisposable 有关。你为什么用它?你真的在跟踪非托管/有限的资源吗?您是在使用它来真正处理某些东西还是作为关闭协议?

    如果您更改 Windsor 的发布政策,所有这些都会消失 - 从而让您处理何时/如果 [to] 调用 dispose。容器试图通过跟踪处理什么以及何时处理来帮助您,但它只能做这么多,所以有时最好加强并承担责任。

    另一个选项是关闭跟踪并公开一个跟踪要处理的东西的服务。这可以更符合语义并了解您的业务/基础设施需求。

    总之:你所做的很好,但每次你需要工厂来创建一些东西时实例化一个临时工厂并不常见。确保为自己未来的自己记录这一点。

    【讨论】:

    • 我没有在工厂创建的瞬态对象上实现一次性对象,尽管我确实希望它们在不再被引用时被 GC'd。通常,当您使用工厂创建对象时,这些对象将是短暂的——在我的例子中,当请求完成处理时,它们将超出范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多