2012-01-23 6 views
3

コードbellowは名前付き接続用のイベントストアを作成します。Jonathan OliverのEventStoreで接続文字列を使用してSqlPersistenceインスタンスを設定する方法は?

var es = Wireup.Init()         
    .UsingSqlPersistence("DB") 
    .Build(); 

私のようなものが必要です:私が見つけた最も簡単な方法は、カスタムIConnectionFactoryを作成することですが、これは右見ていない

var es = Wireup.Init()         
    .UsingSqlPersistence("Data Source=TEST;Initial Catalog=App") 
    .Build(); 

を。助言がありますか?

答えて

3

組み込みのクラスではそれを行う方法が見つかりませんでしたが、あなたが述べたインターフェイスは多かれ少なかれ使いやすいです。あなたが拡張メソッドでそれをラップできたい場合

var fac = new ConnectionStringConnectionFactory(
      "Your Connection String", 
      "System.Data.SqlClient"); 

Wireup.Init().UsingSqlPersistence(fac) 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data.Common; 
using System.Configuration; 
using System.Data; 
using EventStore.Persistence.SqlPersistence; 
using EventStore.Persistence; 

namespace Project.Factories 
{ 
    public class ConnectionStringConnectionFactory : IConnectionFactory 
    { 
     private static readonly IDictionary<string, DbProviderFactory> CachedFactories = 
      new Dictionary<string, DbProviderFactory>(); 

     private string m_connectionString; 
     private string m_providerName; 

     private string m_replicaConnectionString; 
     private string m_replicaProviderName; 

     public ConnectionStringConnectionFactory(string connectionString, string providerName) 
      : this(connectionString, providerName, connectionString, providerName) 
     { 

     } 

     public ConnectionStringConnectionFactory(
      string connectionString, 
      string providerName, 
      string replicaConnectionString, 
      string replicaProviderName) 
     { 
      m_connectionString = connectionString; 
      m_providerName = providerName; 
      m_replicaConnectionString = replicaConnectionString; 
      m_replicaProviderName = replicaProviderName; 
     } 


     public virtual IDbConnection OpenMaster(Guid streamId) 
     { 
      return this.Open(streamId, m_connectionString, m_providerName); 
     } 

     public virtual IDbConnection OpenReplica(Guid streamId) 
     { 
      return this.Open(streamId, m_replicaConnectionString, m_replicaProviderName); 
     } 

     protected virtual IDbConnection Open(Guid streamId, string connectionString, string providerName) 
     { 
      return new ConnectionScope(connectionString,() => this.Open(connectionString, providerName)); 
     } 

     protected virtual IDbConnection Open(string connectionString, string providerName) 
     { 
      var factory = this.GetFactory(providerName); 
      var connection = factory.CreateConnection(); 
      if (connection == null) 
       throw new ConfigurationErrorsException("Invalid provider name"); 

      connection.ConnectionString = connectionString; 

      try 
      { 
       connection.Open(); 
      } 
      catch (Exception e) 
      { 
       throw new StorageUnavailableException(e.Message, e); 
      } 

      return connection; 
     } 

     protected virtual DbProviderFactory GetFactory(string providerName) 
     { 
      lock (CachedFactories) 
      { 
       DbProviderFactory factory; 
       if (CachedFactories.TryGetValue(providerName, out factory)) 
        return factory; 

       factory = DbProviderFactories.GetFactory(providerName); 
       return CachedFactories[providerName] = factory; 
      } 
     } 

     public ConnectionStringSettings Settings 
     { 
      get { return new ConnectionStringSettings("Default", m_connectionString, m_providerName); } 
     } 
    } 
} 

は、それが単に工場に渡す使用するには、次のように

joliverのコードを使用して、私は、接続文字列の工場を実装しました:

Wireup.Init().UsingSqlPersistenceWithConnectionString("") 
0

接続で設定をサポートするためのプル要求が作成されましたイオン列。

https://github.com/NEventStore/NEventStore/pull/358

受け入れられない場合、あなたはまだそれがわずか数行のコードですが、あなた自身のプロジェクトでの接続文字列を使用して設定を有効にするために、コードを使用することができます。

更新日:プルリクエストが受け入れられ、NEventstoreのバージョン5.1から利用可能です。今はナゲットで入手可能です。

関連する問題