nHibernate, ASP.NET MVC, архитектура s # arp и несколько идентичных баз данных - PullRequest
7 голосов
/ 03 ноября 2010

В настоящее время мы разрабатываем приложение на основе NHibernate и ASP.NET MVC и серверной части SQL Server. Поскольку я довольно новичок в NHibernate, я пытаюсь понять лучшие практики.

Наше приложение требует, чтобы у каждого пользователя была своя собственная база данных SQL Server. Все эти базы данных имеют одинаковую структуру.

Наши клиенты идентифицируются по коду клиента, например, 1500.

Мы создали собственного провайдера соединений для nHibernate, который мы уже используем в наших внутренних службах nServiceBus:

public class DynamicConnectionProvider : DriverConnectionProvider
{
    public override IDbConnection GetConnection()
    {
        IDbConnection conn = Driver.CreateConnection();

        try
        {
            var messageExecutionContext = ServiceLocator.Current.GetInstance<ITTTContextProvider>().CurrentContext;
            if (messageExecutionContext.CustomerId == 0)
            {
                conn.ConnectionString = ConfigurationManager.ConnectionStrings["dev"]
                    .ConnectionString;
            }
            else
            {
                conn.ConnectionString = ConfigurationManager.ConnectionStrings["default"]
                    .ConnectionString
                    .FormatWith(messageExecutionContext.CustomerId);
            }

            conn.Open();
        }
        catch (Exception)
        {
            conn.Dispose();
            throw;
        }
        return conn;
    }
}

Этот провайдер соединений проверяет код клиента в объекте контекста и соответственно устанавливает строку соединения.

Мы планируем предоставить HttpContext с поддержкой ITTTContextProvider. Для этого у меня есть два вопроса:

  1. Как мы можем извлечь код клиента из URL и поместить его в наш контекстный объект для каждого запроса? когда мы используем следующий маршрут?

    <main-site-url>/{customercode}/{controller}/{action}/{id}

  2. Допустим ли этот метод подключения к нескольким идентичным базам данных или лучше создать сессионную базу данных foreach customer?

Ответы [ 2 ]

1 голос
/ 13 января 2011

См. Мой недавний пост в блоге, в котором показано, как использовать поддомен для подключения к различным базам данных, хотя было бы легко реализовать собственную версию ITenantContext, которая получала код клиента из URL запроса.Также использует отдельные сеансовые фабрики для каждого арендатора.

http://www.yellowfeather.co.uk/2011/01/multi-tenancy-on-sharp-architecture/

1 голос
/ 09 ноября 2010

Чтобы получить customercode, вам нужно получить доступ к данным маршрута, что-то вроде

HttpContextBase currentContext = new HttpContextWrapper(HttpContext.Current); //ServiceLocator.Current.GetInstance<ITTTContextProvider>().CurrentContext; 
RouteData routeData = RouteTable.Routes.GetRouteData(currentContext);  
var cusomterCode = routeData.Values["customercode"]

Мое второе предложение - не помещать этот код в приведенный выше фрагмент кода. Абстрагируйся. См. ответ Иисуса Навина , в котором подчеркивается подход, о котором я думаю.

Не могу помочь по второму вопросу, на самом деле не знаком с обеими упомянутыми платформами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...