Ich versuche, alle Arten von guten Sachen wie UnitOfWork, Repository, DI zu implementieren. Ich verwende Unity für DI. Hier ist mein Dilemma. Ich habe ein paar (derzeit 3) Datenbanken mit identischem Schema, aber offensichtlich mit anderen Daten aus geschäftlichen Gründen (ich werde sie GroupDB1, GroupDB2 und GroupDB3 nennen). Ich habe auch eine Master-Datenbank (DifferentDB), die ein anderes Schema hat. Mein dbcontext muss zur Laufzeit verschiedene Datenbanken für verschiedene Szenarien verwenden. Ich habe keine Ahnung, wie sie alle zusammen arbeiten sollen.Wie würde ich einen Konstruktor Parameter zur Laufzeit an meine dbContext übergeben und sie auch mit Unity als solche
Hier ist mein dbContexts
public partial class GroupDB2 : DataContext
{
public GroupDB2() : base("name=GroupDB2")
{
}
public IDbSet<T> Set<T>() where T : EntityBase { return base.Set<T>(); }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//......
}
}
public partial class MasterDB : DataContext
{
public MasterDB() : base("name=MasterDB")
{
}
public IDbSet<T> Set<T>() where T : EntityBase { return base.Set<T>(); }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//......
}
}
und hier sind meine andere Schnittstellen und Implementierungen.
public class DataContext : DbContext, IDataContextAsync
{
private readonly Guid _instanceId;
bool _disposed;
public DataContext(string nameOrConnectionString) : base(nameOrConnectionString)
{
_instanceId = Guid.NewGuid();
//Configuration.LazyLoadingEnabled = false;
//Configuration.ProxyCreationEnabled = false;
}
}
public interface IDataContext : IDisposable
{
int SaveChanges();
}
public interface IDataContextAsync : IDataContext
{
Task<int> SaveChangesAsync(CancellationToken cancellationToken);
Task<int> SaveChangesAsync();
}
public interface IRepository<T> where T : class
{
IDataContextAsync Context { get; }
IDbSet<T> DbSet { get; }
void Add(T entity);
void Delete(T entity);
void Delete(dynamic id);
T FindOne(Expression<Func<T, bool>> predicate);
IQueryable<T> FindBy(Expression<Func<T, bool>> predicate);
IQueryable<T> GetAll();
void Update(T entity);
}
public interface IRepositoryAsync<TEntity> : IRepository<TEntity> where TEntity : class
{
Task<TEntity> FindAsync(params object[] keyValues);
Task<TEntity> FindAsync(CancellationToken cancellationToken, params object[] keyValues);
Task<bool> DeleteAsync(params object[] keyValues);
Task<bool> DeleteAsync(CancellationToken cancellationToken, params object[] keyValues);
}
public static IUnityContainer InitializeContainer(IUnityContainer _container)
{
container = _container;
....
....
container.RegisterType<IDataContextAsync, DataContext>(new InjectionConstructor("name=MasterDB"));
container.RegisterType<IUnitOfWorkAsync, UnitOfWork>();// ("Async");
// Here is where I have no clue how do I register and resolve the correct entity context based on some conditions
// Like ConnectionStringService.GetConnectionString(for some condition);
//container.RegisterType<IDataContextAsync, DataContext>("GroupDB", new InjectionConstructor(xxxxxx));
//container.RegisterType<IDataContextAsync, DataContext>("DifferentDB", new InjectionConstructor(yyyyyy));
....
....
return container;
}
Da ich viel über anti-Muster lesen bin ich nur ungern tun
var result = container.Resolve<MyObject>(
new ParameterOverride("x", ExpectedValue)
.OnType<MyOtherObject>());
Ich bin ratlos. Jede Hilfe wird sehr geschätzt. Vielen Dank.
Babu.
Wo rufst du die 'Resolve' Methode an? –
@Yacoub: Ich habe eine UnitOfWork, die IDataContextAsync als Konstruktorparameter verwendet. Eine Serviceschichtklasse wiederum verwendet IUnitOfWork als Konstruktorargument. Diese Schnittstellen sind bereits bei Unity registriert. Also, meine Annahme ist, dass all diese Konstruktorargumente automatisch von Unity aufgelöst werden und ich Resolve nicht manuell auf irgendeinem dieser Konstruktorparameter aufrufe. Hoffe, das beantwortet deine Frage. Also, da ich den Konstruktor von meinem dbContext zur Laufzeit überschreiben oder injizieren muss, ist meine einzige Option, die Resolve irgendwo auf dem DataContext aufzurufen? –
Am Ende Ihrer Frage geben Sie ein Code-Snippet an, das 'Resolve' aufruft. Benutzt du diesen Code irgendwo? Was genau ist deine Frage? –