UnitOfWork、Repository、DIなど、あらゆる種類の良いものを実装しようとしています。 DIのためにUnityを使用しています。ここに私のジレンマがあります。私は同じスキーマを持ついくつか(現在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:IDataContextAsyncをコンストラクタパラメータとして受け取るUnitOfWorkがあります。サービスレイヤークラスは、IUnitOfWorkをコンストラクターの引数として受け取ります。これらのインターフェイスはUnityに既に登録されています。したがって、これらのコンストラクタ引数はすべてUnityによって自動的に解決されると私は想定しており、これらのコンストラクタパラメータのいずれかでResolveを手動で呼び出すことはありません。これはあなたの質問に答えることを願っています。ですから、私は実行時にdbContextのコンストラクタをオーバーライドしたり注入したりする必要があるので、DataContextのどこかでResolveを呼び出す唯一のオプションはありますか? –
あなたの質問の終わりに、あなたは 'Resolve'を呼び出すコードスニペットを提供します。このコードをどこかで使っていますか?あなたの質問は何ですか? –