Ok, ya he hecho algunas preguntas sobre esto antes, pero realmente estoy teniendo mucho tiempo para entender esto.Entity Framework Context - ¡Estoy atascado!
Estoy usando el enfoque Service/Repository/EF 4 w/Pocos, y tengo Ninject configurado e inyectando los controladores con los servicios pero estoy tratando de averiguar dónde inyectar el contexto?
Quiero ser capaz de utilizar múltiples servicios en los controladores que a su vez pueden acceder a múltiples repositorios usando el mismo contexto para que todos los cambios se mantengan a la vez.
Estudié el patrón UnitOfWork, pero no entiendo cómo los MVC (controladores) implementarían esto ya que solo conocen la capa de servicio y las entidades de dominio.
Editar
Como Mohamed sugiere a continuación, inyectar el contexto en los depósitos y luego usar una por cada instancia de solicitud de la misma. ¿Cómo se configura el enlace en la aplicación MVC? Asumiría algo como esto:
Bind(Of IContext).To(MyDataContext)
El problema es que la aplicación MVC no sabe nada del contexto, ¿verdad?
Editar 2
Public Class ProductController
Private _Service As IProductService
Public Sub New(Service As IProductService)
_Service = Service
End Sub
End Class
Public Class NinjectWebModule
Public Sub New()
Bind(Of IProductService).To(ProductService)
End Sub
End Class
Public Interface IProductService
End Interface
Public Class ProductService
Implements IProductService
Private _Repository As IRepository(Of Product)
Public Sub New(Repository As IRepository(Of Product))
_Repository = Repository
End Sub
End Class
Public Class NinjectServiceModule
Public Sub New()
Bind(Of IRepository(Of Product)).To(EFRepository(Of Product))
End Sub
End Class
Public Interface IRepository(Of T As Class)
End Interface
Public Class EFRepository(Of T As Class)
Implements IRepository(Of T)
Private _UnitOfWork As MyUnitOfWork
Public Sub New (UnitOfWork As IUnitOfWork)
_UnitOfWork = UnitOfWork
End Sub
End Class
Public Class NinjectRepositoryModule
Public Sub New()
Bind(Of IUnitOfWork).To(EFUnitOfWork).InRequestScope()
End Sub
End Class
Public Interface IUnitOfWork
Sub Commit()
End Interface
Public Class EFUnitOfWork()
Implements IUnitOfWork
Public Property Context As MyContextType
Public Sub New()
_Context = New MyContextType
End Sub
End Class
Me continuación, registrar los tres módulos de la aplicación MVC?
@ RPM1984 - Ok, entonces crearé un módulo Ninject en el proyecto de repositorios que resuelve el contexto, uno en la capa de servicios que resuelve los repositorios y otro en la aplicación mvc que resuelve los servicios y luego los registra todos desde el mvc aplicación? Entonces, en el proyecto de repositorios, tendría un EFUnitOfWork que implementa IUnitOfWork, y que tendría una propiedad de contexto del tipo MyProjectCotext, y luego el módulo Ninject vincularía (Of IUnitOfWork) .To (Of EFUnitOfWork) y tendría un alcance por solicitud. – Sam
@Sam Striano - ¡listo! Muy bien resumido.:) Lo mejor que puedes hacer es comenzar, mira cómo te va, vuelve y cuéntanos qué problemas has enfrentado/cómo te ha ido e iremos desde allí. Sin embargo, no estoy seguro de lo que quiere decir con "módulo". Solo debe tener un registro: en el nivel web. Todos los componentes (repositorio/servicio/controladores) deben funcionar fuera de las interfaces y, por lo tanto, "no les importa" la implementación real. – RPM1984
@RPM - El enlace Ninject tiene que saber de la implementación concreta ¿no? Entonces, ¿cómo le contarías sobre EFUnitOfWork y mantendrás el SoC? Vea mi edición anterior si quiere. – Sam