Hi,
ich stehe gerade etwas auf dem Schlauch.
Ich möchte dem User anbieten ausuchen zu können, zu welcher DB er connecten möchte. (SQLite, SQLServer, MySQL)
Dazu habe ich für jede Möglichkeit einen Context erstellt, der von einem Basis Context ableitet und dann entsprechend den optionsBuilder configuriert.
Soweit ist das denke ich OK (oder gibts eine bessere Möglichkeit?)
Nun habe ich aber das Problem, das ich im DataProvider ja explicit sagen muss, mit welchem Context der Provider arbeiten soll.
Da hänge ich gerade.
Hier etwas Code:
Interface Context
Context Base
Interface Provider
Basis Provider
Beispiel People Provider
Wie bekomme ich es nun hin, im DataProviderBase nicht explicit einen bestimmten Context einzubauen?
Die Auswahl, welche DB benutzt werden soll, geschieht ja im View Projekt, dort liegen auch die AppSettings da manche Settings auf View interne Sachen zugreifen müssen.
Ich habe also im Provider Projekt keinen Zugriff auf die AppSettings
Danke Euch für nen Denkanstoß.
Grüße Michael
ich stehe gerade etwas auf dem Schlauch.
Ich möchte dem User anbieten ausuchen zu können, zu welcher DB er connecten möchte. (SQLite, SQLServer, MySQL)
Dazu habe ich für jede Möglichkeit einen Context erstellt, der von einem Basis Context ableitet und dann entsprechend den optionsBuilder configuriert.
Soweit ist das denke ich OK (oder gibts eine bessere Möglichkeit?)
Nun habe ich aber das Problem, das ich im DataProvider ja explicit sagen muss, mit welchem Context der Provider arbeiten soll.
Da hänge ich gerade.
Hier etwas Code:
C#-Quellcode
-
- public interface IDbContext : IDisposable
- {
- DbSet<Absence> Absences { get;}
- DbSet<Company> Companies { get;}
- DbSet<LoginData> Logins { get;}
- DbSet<Person> People { get;}
- DbSet<TimeEntry> TimeEntries { get;}
- EntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class;
- int SaveChanges();
- Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken));
- }
C#-Quellcode
-
- public abstract class DbContextBase : DbContext, IDbContext
- {
- protected readonly string _connectionString = null;
- public DbContextBase(string connectionString)
- {
- _connectionString = connectionString;
- }
- #region DbSets
- public virtual DbSet<Absence> Absences { get; set; }
- public virtual DbSet<Company> Companies { get; set; }
- public virtual DbSet<LoginData> Logins { get; set; }
- public virtual DbSet<Person> People { get; set; }
- public virtual DbSet<TimeEntry> TimeEntries { get; set; }
- #endregion
- }
C#-Quellcode
-
- public interface IDataProvider<T> : IDisposable
- {
- #region Get Methods
- Task<T> GetByIdAsync(int id);
- Task<IList<T>> GetListAsync();
- Task<IList<T>> GetListAsync(DataRequest<T> request);
- Task<IList<T>> GetListAsync(int skip, int take, DataRequest<T> request);
- Task<IList<T>> GetKeysAsync();
- Task<IList<T>> GetKeysAsync(DataRequest<T> request);
- Task<IList<T>> GetKeysAsync(int skip, int take, DataRequest<T> request);
- Task<int> GetListCountAsync();
- Task<int> GetListCountAsync(DataRequest<T> request);
- #endregion
- #region Update Methods
- Task<int> UpdateAsync(T item);
- Task<int> DeleteAsync(params T[] items);
- #endregion
C#-Quellcode
-
- public abstract class DataProviderBase : IDisposable
- {
- private bool _disposeContext;
- internal DbContextBase Context { get; set; }
- public DataProviderBase()
- {
- CreateContext(/*hier neuen Context erstelles, also entweder SQLContext, oder SQLite Context usw.*/);
- _disposeContext = true;
- }
- internal DataProviderBase(DbContextBase context)
- {
- CreateContext(context);
- _disposeContext = false;
- }
- private void CreateContext(DbContextBase context)
- {
- Context = context;
- Context.ChangeTracker.LazyLoadingEnabled = false;
- Context.ChangeTracker.AutoDetectChangesEnabled = false;
- Context.Database.EnsureCreated();
- }
- public void Dispose()
- {
- if (_disposeContext) Context.Dispose();
- }
- }
C#-Quellcode
-
- public class PeopleProvider : DataProviderBase, IDataProvider<Person>
- {
- private readonly DbContextBase _context = null;
- public PeopleProvider(DbContextBase dbContext) : base(dbContext)
- {
- _context = dbContext;
- }
- public Task<int> DeleteAsync(params Person[] items)
- {
- throw new NotImplementedException();
- }
- public async Task<Person> GetByIdAsync(int id)
- {
- return await _context.People.Where(p => p.Id == id).FirstOrDefaultAsync();
- }
- public Task<IList<Person>> GetKeysAsync()
- {
- throw new NotImplementedException();
- }
- public Task<IList<Person>> GetKeysAsync(DataRequest<Person> request)
- {
- throw new NotImplementedException();
- }
- public Task<IList<Person>> GetKeysAsync(int skip, int take, DataRequest<Person> request)
- {
- throw new NotImplementedException();
- }
- public Task<IList<Person>> GetListAsync()
- {
- throw new NotImplementedException();
- }
- public Task<IList<Person>> GetListAsync(DataRequest<Person> request)
- {
- throw new NotImplementedException();
- }
- public Task<IList<Person>> GetListAsync(int skip, int take, DataRequest<Person> request)
- {
- throw new NotImplementedException();
- }
- public Task<int> GetListCountAsync()
- {
- throw new NotImplementedException();
- }
- public Task<int> GetListCountAsync(DataRequest<Person> request)
- {
- throw new NotImplementedException();
- }
- public Task<int> UpdateAsync(Person item)
- {
- throw new NotImplementedException();
- }
- }
Wie bekomme ich es nun hin, im DataProviderBase nicht explicit einen bestimmten Context einzubauen?
Die Auswahl, welche DB benutzt werden soll, geschieht ja im View Projekt, dort liegen auch die AppSettings da manche Settings auf View interne Sachen zugreifen müssen.
Ich habe also im Provider Projekt keinen Zugriff auf die AppSettings
Danke Euch für nen Denkanstoß.
Grüße Michael
"Hier könnte Ihre Werbung stehen..."