【问题标题】:How to get SqlPersistence instance configured with connection string in Jonathan Oliver's EventStore?如何在 Jonathan Oliver 的 EventStore 中获取使用连接字符串配置的 SqlPersistence 实例?
【发布时间】:2020-10-27 18:22:30
【问题描述】:

下面的代码将为命名连接创建事件存储。

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

我需要类似的东西:

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

我发现最简单的方法是创建自定义 IConnectionFactory,但这看起来不正确。有什么建议吗?

【问题讨论】:

    标签: c# event-sourcing neventstore


    【解决方案1】:

    我没有找到使用任何内置类的方法,但是您提到的接口或多或少易于使用。

    使用 joliver 的代码,我实现了一个连接字符串工厂,如下所示:

    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); }
            }
        }
    }
    

    要使用它,只需传入一个工厂:

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

    如果您愿意,可以将其包装在扩展方法中:

    Wireup.Init().UsingSqlPersistenceWithConnectionString("")
    

    【讨论】:

      【解决方案2】:

      创建了一个拉取请求以支持带有连接字符串的配置。

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

      如果不接受,您仍然可以在自己的项目中使用该代码启用连接字符串配置,只需几行代码。

      更新: 拉取请求被接受,并且从 NEventstore 的 5.1 版开始可用。现在可以在 nuget 上使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-01
        • 2020-07-30
        • 1970-01-01
        • 2015-03-02
        • 2021-09-19
        相关资源
        最近更新 更多