I have a NHibernate.Cfg.Configuration
provider.
ConfigurationProvider
public class ConfigurationProvider : Provider<Configuration> {
public class ConfigurationProvider(string connectionString
, Assembly mappings) {
ConnectionString = connectionString;
Mappings = mappings;
}
protected override Configuration CreateInstance(IContext context) {
var c = new Configuration().Configure();
c.AddAssembly(Mappings);
c.Properties["connection.connection_string"] = ConnectionString;
return c;
}
private readonly string ConnectionString;
private readonly Assembly Mappings;
}
Which the connection string comes from the Configurationservice.BuildConnectionString()
of my application.
ConfigurationService
public class ConfigurationService {
public ConfigurationService(ICurrentUser user) { CurrentUser = user; }
public string BuildConnectionString() {
return string.Format(DefaultConnectionString
, CurrentUser.DatabaseInstanceName
, CurrentUser.Login
, CurrentUser.Password);
}
private readonly ICurrentUser CurrentUser;
}
That in turn depends on the CurrentUser
to impersonate.
CurrentUser
public class CurrentUser : ICurrentUser {
public CurrentUser(string dbinstance, string login, string password) {
DatabaseInstanceName = dbinstance;
Login = login;
Passwword = password;
}
public readonly string DatabaseInstanceName;
public readonly string Login;
public readonly string Password;
}
So manually injecting my dependency would look like:
string dbInstance = authenticationDialog.DatabaseInstanceName;
string login = authenticationDialog.Login;
string password = authenticationDialog.Password;
var nHibernateConfigurationProvider =
new ConfigurationProvider(
new ConfigurationService(
new CurrentUser(dbInstance, login, password)).BuildConnectionString()
, Assembly.GetExecutingAssembly());
The problem is that I don't know how to bind, using Ninject, the ConfigurationService.BuildConnectionString()
method to resolve the string
used as constructor argument in the ConfigurationProvider.ctor()
.
Pushing it even further, how do I tell Ninject to actually bind these types only once the user is authenticated?
Here's what I have so far
// Wait until user is authenticated before continuing to bind???
Bind<string>().ToMethod(ctx => ctx.Request.???.BuildConnectionString()).WhenInjectedInto<ConfigurationProvider>().InSingletonScope();
Bind<Assembly>().ToConstant<Assembly>(Assembly.GetExecutingAssembly().WhenInjectedInto<ConfigurationProvider>();