Я пытаюсь реализовать всевозможные хорошие вещи, такие как UnitOfWork, Repository, DI. Я использую Unity для DI. Вот моя дилемма. У меня есть несколько (в настоящее время 3) баз данных с одинаковой схемой, но, очевидно, с разными данными по коммерческим причинам (я буду называть их GroupDB1, GroupDB2 и GroupDB3). У меня также есть основная база данных (DifferentDB), которая имеет другую схему. В моем dbcontext необходимо использовать разные базы данных для разных сценариев во время выполнения. Я понятия не имею, как заставить их всех работать вместе.Как передать параметр конструктора во время выполнения в мой dbContext, а также зарегистрировать их в Unity как таковой
Вот мое 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)
{
//......
}
}
и здесь мои другие интерфейсы и реализация.
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;
}
Так как я много читал о анти-шаблоны Я неохотой
var result = container.Resolve<MyObject>(
new ParameterOverride("x", ExpectedValue)
.OnType<MyOtherObject>());
Я озадачен. Любая помощь высоко ценится. Благодарю.
Babu.
Где вы называете метод 'Resolve'? –
@Yacoub: У меня есть UnitOfWork, который принимает IDataContextAsync в качестве параметра конструктора. Класс сервисного уровня, в свою очередь, принимает IUnitOfWork как аргумент конструктора. Эти интерфейсы уже зарегистрированы в Unity. Итак, мое предположение - все эти аргументы конструктора автоматически разрешаются Unity, и я не вызываю вручную Resolve для любого из этих параметров конструктора. Надеюсь, это ответит на ваш вопрос. Итак, поскольку мне нужно переопределить или вставить конструктор моего dbContext во время выполнения, является ли единственным вариантом вызвать Resolve где-нибудь в DataContext? –
В конце вашего вопроса вы предоставляете фрагмент кода, который вызывает 'Resolve'. Вы используете этот код где-нибудь? В чем ваш вопрос? –