У меня есть общая реализация шаблона UnitOfWork, и эти объекты UnitOfWork являются зависимостями от моих классов обслуживания.Приведенные ниже фрагменты должны помочь читателю понять мои настройки кода:
Интерфейс IUnitOfWork
public interface IUnitOfWork<out TContext> where TContext : IDbContext
Класс UnitOfWork
public sealed class UnitOfWork<TContext> : IDisposable, IUnitOfWork<IDbContext> where TContext : IDbContext
{
private static readonly ILog Log = LogManager.GetLogger(typeof(UnitOfWork<TContext>));
private readonly IDbContext _dbContext;
private Dictionary<string, IRepository> _repositories;
private IDbTransaction Transaction { get; set; }
public UnitOfWork(IDbContext context)
{
_dbContext = context;
}
}
Регистрация контейнеров:
builder.RegisterGeneric(typeof(UnitOfWork<>)).As(typeof(IUnitOfWork<>));
builder.RegisterType<ReconciliationDbContext>().As<IDbContext>();
builder.RegisterType<GenevaDataDbContext>().As<IDbContext>();
builder.RegisterType<OpenStaarsDbContext>().As<IDbContext>();
builder.RegisterType<UnitOfWork<ReconciliationDbContext>>().Keyed<IUnitOfWork<IDbContext>>(ContextKey.Recon);
builder.RegisterType<UnitOfWork<OpenStaarsDbContext>>().Keyed<IUnitOfWork<IDbContext>>(ContextKey.OpenStaars);
builder.RegisterType<CommentsService>().As<ICommentsService>().WithAttributeFiltering();
Классы DbContext:
public class ReconciliationDbContext : BaseDbContext<ReconciliationDbContext>, IDbContext
{
private const string DbSchema = "BoxedPosition";
public ReconciliationDbContext() : base("Reconciliation")
{
}
}
public class OpenStaarsDbContext : BaseDbContext<OpenStaarsDbContext>, IDbContext
{
public OpenStaarsDbContext() : base("OpenStaars")
{
}
}
Комментарии Класс обслуживания:
public class CommentsService : ICommentsService
{
private readonly IUnitOfWork<IDbContext> _reconciliationUoW;
public CommentsService([KeyFilter(ContextKey.Recon)] IUnitOfWork<IDbContext> reconciliationUoW)
{
_reconciliationUoW = reconciliationUoW;
}
}
Resolving ICommentsService:
var commentsService = container.Resolve<ICommentsService>();
Теперь, когда я пытаюсь разрешить тип ICommentsService, он создает зависимость UnitOfWork.Однако свойство UnitOfWork._dbContext соответствует типу OpenStaarsDbContext.Это особенно странно, учитывая наши регистрации.
Страннее становится, если мы переупорядочим наши регистрации IDbContext путем регистрации GenevaDataDbContext после OpenStaarsDbContext.Теперь _dbContext оценивается для экземпляра GenevaDataDbContext.
Как это исправить, чтобы зависимость CommentsService в файле recciliationUoW имела правильный экземпляр ReconciliationDbContext?