Castle Windsor:如何使用PerThread生活方式发布实例

时间:2016-06-07 20:17:58

标签: c# .net dependency-injection inversion-of-control castle-windsor

我在Windows服务中使用Castle Windsor和PerThread生活方式。

当一个新的线程工作者启动时,windsor会创建一个新的实例,但是在我们的win-service的整个生命周期中,它永远不会被丢弃并留在内存中。

我在Windsor文档中看到:

  

明确释放该组件 。实例将是   当他们注册的容器 处置时发布

但在我们的例子中 - 我需要在线程工作结束时释放PerThread实例。因此,我们无法处置整个容器 - 它将处理所有其他线程所需的实例或任何已解析的实例。
需要处理子容器等的解决方案似乎过于复杂,并且对于我们的每线程需求而言并不是真正有效。

目前我们非常关注关于在IOC容器中保存的实例数量,直到Windows服务停止为止。

问题:
1.有没有办法实现此操作 - 从IOC容器中释放特定的每线程实例,以便它将由GC处理?

2.是否有一种首选的方法可以通过定制生活方式或类似的方式来解决这个问题?

3.我已经了解了一种可能适合我们案例的方式 - 使用" Scoped "生活方式和呼唤" Container.BeginScope()"在线程工作者的开头,并将作用域放在线程工作的最后。
但我不熟悉这种生活方式,如果它的线程安全,并且在线程环境中使用此选项不会导致任何问题。

TNX。

更新1: 这是反映我们案例流程的基本例子。

 // This is a thread worker logic.
// We need that IConfig will be the same instance for the entire thread's context.
public void ThreadWorker(object manager)
{
    // Init config object.
    var config = Container.Resolve<IConfig>();
    // Updating states in config
    config.init(manager);

    // working.
    doSomeLogics(manager.services);
}

private void doSomeLogics(List<IService> services) 
{
    foreach (Iservice curService in services) 
    {
        curService.Execute();
    }
}


// Each IService implementor comes from external dlls and cannot be changed since its decoupled from our main app.

public class Service1 : IService 
{
    public void Execute()
    {
        // Use the IConfig instance which need to be the same instance per thread.
        IConfig curConfig = Container.Resolve<IConfig>();

        // using the curConfig properties to do a specific work...
    }
}

public class Service2 : IService 
{
    public void Execute()
    {
        // Use the IConfig instance which need to be the same instance per thread.
        IConfig curConfig = Container.Resolve<IConfig>();

        // using the curConfig properties to do a specific work...
    }
}

0 个答案:

没有答案