Возможно, вы захотите сделать шаг назад и взглянуть на свой дизайн. Я обнаружил, что большую часть времени я думал, что мне нужна сложная конфигурация DI, проблема была на самом деле в моем дизайне. Вот несколько вариантов, которые вы могли бы рассмотреть:
1) Используйте фабрику для создания репозиториев и предоставьте контекст для этой фабрики:
var repositoryFactory = container.Resolve<IRepositoryFactory>();
using (var context = container.Resolve<IGeneralContext>())
{
var rep = repositoryFactory.Create<IClienteRepository>(context);
// ...
}
public class RepositoryFactory : IRepositoryFactory
{
public TRepository Create<TRepository>(IGeneralContext context)
where TRepository : IRepository
{
var repository = Container.Resolve<TRepository>();
repository.Context = context;
return repository;
}
}
2) Попробуйте сделать репозитории частью контекста:
using (var context = container.Resolve<IGeneralContext>())
{
var nc = new Cliente() { };
context.Clientes.Add(nc);
// ...
}
Если невозможно поместить все эти свойства репозитория в сам контекст, вы можете создать объект-оболочку:
using (var context = container.Resolve<NorthwindContext>())
{
var nc = new Cliente() { };
context.ClienteRepository.Add(nc);
// ...
}
public class NorthwindContext
{
private IGeneralContext context;
private IRepositoryFactory repFactory;
public NorthwindContext(IGeneralContext context,
IRepositoryFactory repFactory)
{
this.context = context;
this.repFactory = repFactory;
}
public IClienteRepository Clientes
{
get { return this.repFactory
.Create<IClienteRepository>(this.context); }
}
public IOrderRepository Orders
{
get { return this.repFactory
.Create<IOrderRepository>(this.context); }
}
public void CommitChanges()
{
this.context.CommitChanges();
}
}
Вы также можете попытаться свести к минимуму количество вызовов в контейнер. Попробуйте ввести столько, сколько сможете через конструктор.
Вот интересный вопрос SO о шаблоне Единицы работы (= контекст) и репозиториях, которые могут быть полезны.
Надеюсь, это поможет.