Как внедрить один экземпляр фабрики в несколько хранилищ и единицу работы, используя ninject? - PullRequest
6 голосов
/ 31 января 2012

Во-первых, у меня есть фабрика dbcontext, которая определена public class DatabaseFactory : Disposable, IDatabaseFactory, и она просто создает контекст, если он еще не существует.

Далее, у меня есть общий репозиторий, который определен public class Repository<T> : IRepository<T> where T : class, которыйпринимает фабрику в конструктор.У меня есть другие конкретные репозитории, которые наследуются от этого.

У меня также есть единица рабочего класса, которая определена public class UnitOfWork : IUnitOfWork, которая принимает фабрику в конструкторе и сохраняет все изменения в контексте внутри фабрики (котораявсе репозитории должны использовать).

В моем контроллере у меня установлен конструктор public ProjectController(IDatabaseFactory factory, IUnitOfWork unitOfWork, IProjectRepository projectRep, IUserRepository userRep).

По сути, мне нужно, чтобы тот же экземпляр фабрики передавался единицеработа и все репозитории.С помощью ninject он создает новую фабрику для каждого объекта вместо передачи одного экземпляра им всем.Есть ли способ разрешить прохождение только одного экземпляра через нинжект или я неправильно создаю свою фабрику и / или неправильно понимаю нинъект?

Вот мои привязки в нинъекте:

kernel.Bind<IProjectRepository>().To<ProjectRepository>();
kernel.Bind<IIssueRepository>().To<IssueRepository>();
kernel.Bind<IUserRepository>().To<UserRepository>();
kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>();
kernel.Bind<IUnitOfWork>().To<UnitOfWork>();

1 Ответ

10 голосов
/ 31 января 2012

Это происходит потому, что по умолчанию Ninject использует область действия Transient, которая создает новый экземпляр каждый раз, когда запрашивается тип.

Подробнее: https://github.com/ninject/ninject/wiki/Object-Scopes

Вы должны указать область действия в зависимости от фактического использования конкретного экземпляра типа в вашем приложении:

Пример может выглядеть так:

kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>().InSingletonScope();
kernel.Bind<IUserRepository>().To<UserRepository>().InRequestScope();
...