2012-01-31 8 views
6

Primero, tengo una fábrica de dbcontext que se define como public class DatabaseFactory : Disposable, IDatabaseFactory y simplemente crea un contexto si aún no existe.¿Cómo inyectar una única instancia de fábrica a múltiples repositorios y unidades de trabajo usando ninject?

A continuación, tengo un repositorio genérico que se define public class Repository<T> : IRepository<T> where T : class que toma la fábrica en el constructor. Tengo otros repositorios concretos que heredan de este.

También tengo una unidad de clase de trabajo que se define public class UnitOfWork : IUnitOfWork que toma la fábrica en el constructor y guarda todos los cambios en el contexto dentro de la fábrica (que todos los repositorios deberían estar usando).

En mi controlador, tengo el conjunto de constructores como public ProjectController(IDatabaseFactory factory, IUnitOfWork unitOfWork, IProjectRepository projectRep, IUserRepository userRep).

Básicamente, necesito la misma instancia de la fábrica para pasarla a la unidad de trabajo y a todos los repositorios. Con ninject, crea una nueva fábrica para cada objeto en lugar de pasarles una sola instancia a todos. ¿Hay alguna manera de permitir que solo la instancia se pase a través de ninject o no estoy creando mi fábrica correctamente y/o no estoy entendiendo ninject correctamente?

Éstos son mis fijaciones en 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>(); 

Respuesta

10

Esto sucede porque por defecto Ninject utiliza el Transient alcance - que crea una nueva instancia cada vez que se solicita un tipo.

Más información:https://github.com/ninject/ninject/wiki/Object-Scopes

Se debe especificar el alcance en función del uso real de un caso particular de un tipo a través de su aplicación:

ejemplo podría tener este aspecto:

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

¿De verdad? Traté de buscar esa respuesta durante la última hora y media. Eso es exactamente lo que estaba buscando. No tengo idea de por qué fue tan difícil encontrar esa respuesta a través de google. Tal vez estaba tratando de hacerlo mucho más difícil de lo que era. ¡Gracias de nuevo! – snoluet

+0

Si encontraste que mi publicación es útil, puedes aceptarla como respuesta :) – MonkeyCoder

+0

Lo haré, lo respondiste muy rápido y ahora tengo que esperar 4 minutos :) Gracias. Pregunta rápida si tiene un segundo, si pongo la fábrica como singleton, ¿creará una aplicación de instancia única de ancho o solo dentro del controlador actual? Si quiero una instancia diferente de la fábrica para IssueController que ProjectController (pero una única instancia de ella dentro de ese controlador específico), ¿no me ocuparé de eso? – snoluet

Cuestiones relacionadas