UnitOfWork, Repository, DI와 같은 모든 종류의 좋은 것들을 구현하려고합니다. DI 용 Unity를 사용하고 있습니다. 여기 내 딜레마가있다. 필자는 동일한 스키마를 가진 몇 가지 (현재 3 개) 데이터베이스를 가지고 있지만 분명히 비즈니스상의 이유로 서로 다른 데이터를 가지고 있습니다 (나는 GroupDB1, GroupDB2 및 GroupDB3라고 부름). 다른 스키마가있는 마스터 데이터베이스 (DifferentDB)도 있습니다. dbcontext는 런타임시 다른 시나리오에 대해 다른 데이터베이스를 사용해야합니다. 나는 그들 모두가 함께 일할 수있는 방법이 없다.런타임시 생성자 매개 변수를 dbContext에 전달하고 유니티와 같이 등록하는 방법은 무엇입니까?
은 여기 내 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.
여기서 '해결'방법은 무엇입니까? –
@Yacoub : IDataContextAsync를 생성자 매개 변수로 사용하는 UnitOfWork가 있습니다. 서비스 레이어 클래스는 차례대로 IUnitOfWork를 생성자 인수로 사용합니다. 이 인터페이스들은 이미 Unity에 등록되어 있습니다. 그래서, 제 생각에 이러한 모든 생성자 인수는 Unity에 의해 자동으로 해결되며 이러한 생성자 매개 변수 중 하나에서 Resolve를 수동으로 호출하지 않습니다. 희망이 당신의 질문에 대한 답변. 그래서, 런타임에 내 dbContext의 생성자를 오버라이드하거나 삽입해야하기 때문에 DataContext의 Resolve를 호출하는 유일한 방법은 무엇입니까? –
질문 끝에 '해결'을 호출하는 코드 스 니펫을 제공합니다. 이 코드를 어딘가에서 사용하고 있습니까? 당신의 질문은 정확히 무엇입니까? –