城堡温莎儿童容器终身

时间:2015-05-20 16:24:44

标签: dependency-injection castle-windsor ioc-container

如果没有通过parent.RemoveChildContainer(child)从父容器中显式删除子容器,那么windsor会在什么条件下处理/删除子容器?我假设它们将无限期地存在于父级子容器集合中,而不管父级之外是否存在引用。有人测试过这个或者在这里有一些见解吗?

1 个答案:

答案 0 :(得分:0)

WindsorContainer实现IDisposable,子容器在处理时将从其父容器中删除:

    public virtual void Dispose()
    {
        Parent = null;
        childContainers.Clear();
        kernel.Dispose();
    }

何时处理具体实施。例如,如果我每次在Winform应用程序上打开一个新表单时创建一个子容器,我可以在表单关闭时处理它。另一个例子是我为每个Web请求创建一个子容器:

Component.For<IMyService>().UsingFactoryMethod(k =>
            {
                var childContainer = new WindsorContainer() { Parent = parentContainer };
                return new MyService(childContainer);

            }).LifeStyle.PerWebRequest;

MyService还将实现IDisposable:

public class MyService : IMyService, IDisposable
{
    public MyService(IWindsorContainer container)
    {
       ...
    }

    public void Dispose()
    {
        this.Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            this.container.Dispose();
        }
    }
}

确实,你如何使用儿童容器可能会有很大不同。我只是想分享一些经验:)