组件的生命周期

1044 发布于: 2021-03-24 读完约需 2 分钟

如果你使用过或正在使用IOC/DI容器,那么这对你了解和熟悉组件的生命周期将是非常有用的。

通常情况下,建议将ElasticClient实例注册为一个单例,因为ElasticClient客户端是线程安全的,因此跨线程共享实例是没问题的。单例最大的好处是会为每个ConnectionSettings建立缓存。

但在某些应用程序中,也有可能会为不能的ConnectionSettings创建不同的ElasticClient实例,因为应用程序可能连接两个不同的Elasticsearch集群。

特别注意:由于Elasticsearch的语义版本控制,Elasticsearch.Net、NEST及其Elasticsearch版本,所有连接到的ElasticClient和Elasticsearch集群的实例必须在同一个主版本上。

下面通过创建派生于ConnectionSettingsIConnectionPoolIConnection等类型来演示哪些组件会被释放:

private class AConnectionSettings : ConnectionSettings
{
    public AConnectionSettings(IConnectionPool pool, IConnection connection)
        : base(pool, connection)
    { }

    public bool IsDisposed { get; private set; }

    protected override void DisposeManagedResources()
    {
        this.IsDisposed = true;
        base.DisposeManagedResources();
    }
}

private class AConnectionPool : SingleNodeConnectionPool
{
    public AConnectionPool(Uri uri, IDateTimeProvider dateTimeProvider = null) : base(uri, dateTimeProvider) { }

    public bool IsDisposed { get; private set; }

    protected override void DisposeManagedResources()
    {
        this.IsDisposed = true;
        base.DisposeManagedResources();
    }
}

private class AConnection : InMemoryConnection
{
    public bool IsDisposed { get; private set; }

    protected override void DisposeManagedResources()
    {
        this.IsDisposed = true;
        base.DisposeManagedResources();
    }
}

ConnectionSettingsIConnectionPoolIConnection都显式地实现了IDisposable

var connection = new AConnection();
var connectionPool = new AConnectionPool(new Uri("http://localhost:9200"));
var settings = new AConnectionSettings(connectionPool, connection);
settings.IsDisposed.Should().BeFalse();
connectionPool.IsDisposed.Should().BeFalse();
connection.IsDisposed.Should().BeFalse();

释放一个ConnectionSettings同时也会释放它使用到的IConnectionPoolIConnection实例

var connection = new AConnection();
var connectionPool = new AConnectionPool(new Uri("http://localhost:9200"));
var settings = new AConnectionSettings(connectionPool, connection);
using (settings) { } // 使用using来强制释放using块中的资源
settings.IsDisposed.Should().BeTrue();
connectionPool.IsDisposed.Should().BeTrue();
connection.IsDisposed.Should().BeTrue();

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

发表评论

登录用户才能发表评论, 请 登 录 或者 注册