Поместите конструктор, который принимает DbContext на класс, производный от вашего IRepositoryFactory
class RepositoryFactory : IRepositoryFactory
{
DbContext _dbc;
public RepositoryFactory(DbContext db)
{
_dbc = db;
}
public IRepository CreateRepository()
{
return new Repository(_dbc);
}
}
Затем вы связываете, что DbContext на вашей инъекции Ninject переплеты, поставить это вместе с другими креплениями:
ninjectKernel.Bind<DbContext>().To<EfDbContext>().InRequestScope();
Я просто принимая догадку здесь, это то, как ваши привязок инъекции для RepositoryFactory выглядит следующим образом:
ninjectKernel.Bind<IRepositoryFactory<Person>>().To<RepositoryFactory<Person>>();
Если вы сделали эти две привязки рядом друг с другом (порядок не имеет значения), Ninject должен иметь возможность делать инъекцию значения в параметр DbContext вашего конструктора RepositoryFactory.
Пример
Посмотрите на линии 60 до 76 здесь: http://code.google.com/p/flexigrid-crud-example/source/browse/trunk/FlexigridCrudDemo/FlexigridCrudDemo/NinjectDependencyResolver.cs
Смотрите шаблон репозитория для EF здесь, строка 22: http://code.google.com/p/to-the-efnh-x/source/browse/trunk/ToTheEfnhX/Ienablemuch.ToTheEfnhX.EntityFramework/EfRepository.cs
Смотрите шаблон хранилища для NHibernate здесь, строка 24: http://code.google.com/p/to-the-efnh-x/source/browse/trunk/ToTheEfnhX/Ienablemuch.ToTheEfnhX.NHibernate/NhRepository.cs
И как я отвлек эти два разнородных ORM с хранилищем шаблон, инъекции depency для соединений (DbContext для Entity Framework, Session для NHibernate) способствует Ninject:
int target = 1; // memory, nhibernate, entity framework
switch (target)
{
case 0:
ninjectKernel.Bind<IRepository<Person>>().ToMethod(x =>
{
var person = new MemoryRepository<Person>();
person.Save(new Person { Username = "Hello", Firstname = "Yo", FavoriteNumber = 9 }, null);
person.Save(new Person { Username= "See", Firstname = "Nice" }, null);
return person;
}
).InSingletonScope();
break;
case 1:
ninjectKernel.Bind<ISession>().ToMethod(x => ModelsMapper.GetSessionFactory().OpenSession()).InRequestScope();
ninjectKernel.Bind<Ienablemuch.ToTheEfnhX.IRepository<Person>>().To<Ienablemuch.ToTheEfnhX.NHibernate.NhRepository<Person>>();
ninjectKernel.Bind<Ienablemuch.ToTheEfnhX.IRepository<Country>>().To<Ienablemuch.ToTheEfnhX.NHibernate.NhRepository<Country>>();
break;
case 2:
ninjectKernel.Bind<DbContext>().To<EfDbContext>().InRequestScope();
ninjectKernel.Bind<Ienablemuch.ToTheEfnhX.IRepository<Person>>().To<Ienablemuch.ToTheEfnhX.EntityFramework.EfRepository<Person>>();
ninjectKernel.Bind<Ienablemuch.ToTheEfnhX.IRepository<Country>>().To<Ienablemuch.ToTheEfnhX.EntityFramework.EfRepository<Country>>();
break;
default:
break;
}