gpt4 book ai didi

c# - 如何在 Jonathan Oliver 的 EventStore 中获取配置了连接字符串的 SqlPersistence 实例?

转载 作者:行者123 更新时间:2023-11-30 16:26:16 24 4
gpt4 key购买 nike

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

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

我需要这样的东西:

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

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

最佳答案

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

我使用 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("")

关于c# - 如何在 Jonathan Oliver 的 EventStore 中获取配置了连接字符串的 SqlPersistence 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8972903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com