MVC - динамическое связывание с несколькими базами данных с использованием Ninject? - PullRequest
1 голос
/ 02 ноября 2011

У меня есть небольшое приложение MVC, которое подключается к одной базе данных MYSQL.Я настроил его с помощью Ninject, чтобы связать connectionString во время запуска приложения.Код выглядел так:

Global.asax.cs:

protected void Application_Start()
{ 
... 
   ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory()); 
}

NinjectControllerFactory.cs:

public class NinjectControllerFactory : DefaultControllerFactory 
{ 
... 
   private class EriskServices : NinjectModule 
    { 
       public override void Load() 
       { 
                // Bind all the Repositories  
                Bind<IRisksRepository>().To<MySql_RisksRepository>() 
                    .WithConstructorArgument("connectionString",  
                    ConfigurationManager.ConnectionStrings["dbcMain"]
                    .ConnectionString); 
       } 
    } 
}

Сегодня мои требования изменились, и я должен сейчасподдержка нескольких баз данных.Я хотел бы, чтобы каждая строка подключения к базе данных была определена в файле web.config, как это было раньше.Пользователь выбирает, к какой базе данных он хочет подключиться во время входа в приложение.

Какой самый простой способ привязать мои репозитории после входа в систему?Я предполагаю, что мне нужно будет кодировать привязку базы данных в контроллере входа в систему.

Я новичок в Ninject, поэтому любые примеры будут высоко цениться!

Как всегда, спасибо завремя и помощь!.

1 Ответ

1 голос
/ 03 ноября 2011

Я бы, вероятно, связал репозиторий с Ninject.Activation.IProvider, а затем создал бы своего собственного провайдера, который извлекает connectionString из сеанса

Bind<IRisksRepository>().ToProvider<SessionConnectionProvider>();

тогда ...

public class SessionConnectionProvider : Ninject.Activation.IProvider
{
    #region IProvider Members

    public object Create( Ninject.Activation.IContext context )
    {
        // use however you're accessing session here
        var conStr = session.ConnectionString;
        return new MySql_RisksRepository( conStr );
    }

    public Type Type
    {
        get { return typeof( IRisksRepository ); }
    }

    #endregion
}
...