Impostazione della stringa di connessione di un DBContext nella mia class repository usando Ninject

Ho un’applicazione MVC 5 che utilizza EF 6 e implementa pattern Repository con l’iniezione delle dipendenze utilizzando il contenitore DI Ninject. La stringa di connessione per dbcontext è memorizzata nel file Web.config che il contesto EF trova correttamente. Tutto funziona bene Ultimamente, ho il requisito che la connessione al mio DBContext debba essere determinata in fase di runtime e connettersi a diversi database (ma con esattamente la stessa struttura). Quindi, ho bisogno di cambiare la parte sql connectiontring dal connectiontring dell’ quadro in fase di esecuzione prima dell’istanza del repository. Gradirei davvero un aiuto nel farlo. Non sono un DI guru; Conosco appena abbastanza Ninject per far funzionare le mie cose.

Ecco la mia interfaccia di base del repository:

public interface IRepositoryBase where T : class { void Add(T entity, string userGuid = ""); void Delete(T entity); // ... removed other method signatures for brevity } 

Implementazione base del mio repository:

 public abstract class RepositoryBase : IRepositoryBase, IDisposable where T : class where D : DbContext, new() { private Guid? currUserGuid = null; private D dataContext; protected D DataContext { get { if (dataContext == null) dataContext = new D(); return dataContext; } set { dataContext = value; } } public IQueryable FindBy(Expression<Func> predicate) { return DataContext.Set().Where(predicate); } public virtual IQueryable GetAll() { IQueryable query = DataContext.Set(); return query; } public virtual void Delete(T entity) { OperationStatus stat = TryDelete(entity); } // .... removed rest for brevity } 

Interfaccia e implementazione per class di calcestruzzo:

  public interface ICustomerRepository : IRepositoryBase { Customer GetCustomerAndStatus( Guid custGuid ); } public class CustomerRepository : RepositoryBase, ICustomerRepository { public Customer GetCustomerAndStatus( Guid custGuid ) { return DataContext.Customers.Include( x => x.CustStatusType ) .SingleOrDefault( x => x.PKGuid == custGuid ); } } 

Il mio risolutore di dipendenze Ninject:

  public class NinjectDependencyResolver : IDependencyResolver { private IKernel kernel; public NinjectDependencyResolver() { kernel = new StandardKernel(); AddBindings(); } public IKernel Kernel { get { return kernel; } } private void AddBindings() { kernel.Bind().To(); // ... other bindings are omitted for brevity } } 

e infine, ecco il mio Entity Framework generato DBContext:

 public partial class PCDataEFContext : DbContext { public PCDataEFContext() : base("name=PCDataEFContext") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { throw new UnintentionalCodeFirstException(); } public virtual DbSet Customers { get; set; } } 

Tutto il codice sopra funziona alla grande! Ma come ho detto all’inizio, non so come iniettare la stringa di connessione nella mia class Repositorybase in fase di runtime in modo che non debba modificare nessuno dei miei repository ereditati (ne ho molti). Qualcuno per favore aiuto.

Babu.

Potresti farlo in questo modo?

 public partial class PCDataEFContext : DbContext { public PCDataEFContext() : base(Util.GetTheConnectionString()) { } } public class MyDerivedContext : PCDataEFContext { public MyDerivedContext() : base() { } } class Util { public static string GetTheConnectionString() { // return the correct name based on some logic... return "name=PCDataEFContext"; } } 

Un altro modo per farlo potrebbe essere nella class RepositorBase definita, modificando la connessione dopo la creazione di dbcontext:

  protected D DataContext { get { if (dataContext == null) { dataContext = new D(); dataContext.Database.Connection.ConnectionString = "the new connectionstring"; } return dataContext; } set { dataContext = value; } }