Как настроить экземпляр SqlPersistence с помощью строки подключения в хранилище событий Джонатана Оливера? - PullRequest
3 голосов
/ 23 января 2012

Код ниже создаст хранилище событий для именованного соединения.

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

Мне нужно что-то вроде:

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

Самый простой способ, который я нашел, - это создание собственной IConnectionFactory, но это выглядит не так. Есть предложения?

Ответы [ 2 ]

3 голосов
/ 27 января 2012

Я не нашел способа сделать это ни с одним из встроенных классов, но есть интерфейс, с которым вы упомянули, более или менее простой в использовании.

Используя код joliver, я реализовал фабрику Connection String следующим образом:

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("")
0 голосов
/ 31 июля 2014

Создан пул-запрос для поддержки конфигурации со строкой соединения.

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

Если он не принят, вы все равно можете использовать код для включения конфигурации со строкой соединения в вашем собственном проекте,это всего лишь несколько строк кода.

ОБНОВЛЕНИЕ: Запрос на извлечение принят и доступен начиная с версии 5.1 NEventstore.Который теперь доступен на nuget.

...