生命周期
如果您使用的是IOC容器,那么它总是有助于了解您的对象生命周期中的最佳实践
一般来说,我们建议人们将ElasticClient实例注册为单例模式。客户端是线程安全的,所以在线程之间共享一个实例是很好的。
然而,放大实际的移动部分,在应用程序的大部分时间内受益最大的是ConnectionSettings;缓存是每个ConnectionSettings。
在某些应用程序中,使用不同的连接设置注册多个单例ElasticClient可能是完美的。例如,如果您有2个功能独立的Elasticsearch集群。
重要
由于Elasticsearch.Net和NEST的语义版本以及它们与Elasticsearch版本的对齐,所有连接到ElasticClient和Elasticsearch集群的实例必须位于相同的主要版本上,即不可以同时使用ElasticClient来连接与前者相同的应用程序中的ElasticClient 1.x和2.x将需要NEST 1.x,后者为NEST 2.x。
我们来演示通过创建我们自己的派生的ConnectionSettings,IConnectionPool和IConnection类型来处理哪些组件
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();
}
}
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();
}
}
class AConnection : InMemoryConnection
{
public bool IsDisposed { get; private set; }
protected override void DisposeManagedResources()
{
this.IsDisposed = true;
base.DisposeManagedResources();
}
}
ConnectionSettings,IConnectionPool和IConnection都可以实现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也会处理它使用的IConnectionPool和IConnection
var connection = new AConnection();
var connectionPool = new AConnectionPool(new Uri("http://localhost:9200"));
var settings = new AConnectionSettings(connectionPool, connection);
settings.IsDisposed.Should().BeTrue();
connectionPool.IsDisposed.Should().BeTrue();
connection.IsDisposed.Should().BeTrue();