c# .net ado.net ninject

c# - DbContext con Ninject ADO.NET



(4)

Creo que lo hiciste demasiado complicado en Ninject Dependency Resolver.

No debe crear DbContext con una palabra clave nueva. En su lugar, debe hacer que Ninject resuelva DbContext en el alcance de la solicitud o en el alcance del subproceso .

Para registrar DbContext puedes hacerlo así:

kernel.Bind<DbContext>().To<MyDbContext>().WithConstructorArgument("someArgument", "someValue").InRequestScope(); kernel.Bind<IMyManager>().To<MyManager>().InRequestScope(); kernel.Bind<IMyRepository>().To<MyRepository>().InRequestScope();

No necesita precisar el argumento constructor para DbContext ya que DbContext solo se registra una vez en el Ninject.

También puede registrar DbContext en una clase DbContextProvider y allí puede agregar alguna lógica específica para resolver el objeto.

Ejemplo:

kernel.Bind<DbContext>().ToProvider<MyDbContextProvider>().InRequestScope(); internal class MyDbContextProvider : Ninject.Activation.IProvider { public object Create(IContext context) { return new MyDbContext("connectionStringArgument"; } public Type Type { get { return typeof (MyDbContext); } } }

Espero que esto ayude.

Estoy trabajando en un gran proyecto que se ha completado en un 80% (aunque es necesario implementar algunas características). Pero recientemente descubrimos que el proyecto no permite solicitudes simultáneas (me refiero a que varios usuarios solicitan el mismo repositorio). En algún momento obtenemos un comentario nulo y en ocasiones "Ejecutado no puede abrir la conexión disponible, el estado de la conexión está cerrado", etc. Nuestro código fuente está fuertemente restringido fuera del mundo. Aquí hay un código. Avíseme si hay algún problema arquitectónico, ya que los chicos de la arquitectura se fueron de la compañía. Está usando ninject 3.0. Ya utilicé InRequestScope () para todos los repositorios del administrador, pero no tuve suerte

Actualización: no estoy usando ningún ORM aquí, estoy tratando de conectar SqlServer a través del adaptador de datos en mi clase DbContext

public class DbContext { //execute query , nonquery etc using adapter & datatable //Example var dt=new DataTable(); _adapter=new _dbfactory.CreateAdapter(); _adapter.Fill(dt); return dt; } //MyController public class MyController { private readonly IMyManager_iMyManager; public MyController(IMyManager iMyManager){_iMyManager=iMyManager} public ActionResult Save() { _iMyManager.Save() } } // My Manager public class MyManager:IMyManager { private readonly IMyRepository _iMyRepository; DbContext _dbContext=new DbContext("someParameter","connectionstring"); public MyManager ( IMyRepository iMyRepository, DbContext dbContext ) { _iMyRepository=iMyRepository; _dbContext=dbContext; } Public DataTable GetDataTable() { try { _dbContext.Open(); _iMyRepository.GetDataTable() } catch(Exception ex){} finally{_dbContext.Close()} } }

// aquí está el repositorio

Public class MyRepository:IMyRepository { public _dbContext; public MyRepository(DbContext dbContext) { _dbContext=dbContext; } public DataTable GetDataTable() { return _dbContext.ExecuteQuery()} }

Finalmente Aquí está nuestro enlace de ninject

public class NinjectDependencyResolver() { var context=new DbContext("someparameter","connectionStrin"); kernel.Bind<IMyManager>().To<MyManager>().WithConstructorArgument("_dbContext",context); kernel.Bind<IMyRepository >().To<MyRepository >().WithConstructorArgument("_dbContext",context); }

puede haber algún error tipográfico en mi código ya que escribí todo en ese editor


Dos problemas:

// My Manager public class MyManager:IMyManager { private readonly IMyRepository _iMyRepository; DbContext _dbContext=new DbContext("someParameter","connectionstring"); public MyManager ( IMyRepository iMyRepository, DbContext dbContext ) { _iMyRepository=iMyRepository; _dbContext=dbContext; }

El nuevo que se crea para el campo se sobrescribirá cuando se llame al constructor.

public class NinjectDependencyResolver() { var context=new DbContext("someparameter","connectionStrin"); kernel.Bind<IMyManager>().To<MyManager>().WithConstructorArgument("_dbContext",context); kernel.Bind<IMyRepository >().To<MyRepository >().WithConstructorArgument("_dbContext",context); }

Usted crea el contexto aquí una vez y lo pasa a cada creación de objeto. Por lo tanto, todavía está reutilizando el objeto de contexto en lugar de crearlo para cada ámbito de solicitud.


Si está inicializando algo en el nivel de campo, ¿por qué lo inicializaría de nuevo desde el constructor?

private readonly IMyRepository _iMyRepository; DbContext _dbContext=new DbContext("someParameter","connectionstring"); public MyManager(IMyRepository iMyRepository, DbContext dbContext) { _iMyRepository=iMyRepository; _dbContext=dbContext; }

Esto también puede ser un error tipográfico. Elimine la inicialización _dbContext del constructor o delegue la tarea de inicialización a la persona que llama de esta clase.

La inicialización múltiple también puede ser el problema. ya que está haciendo la inicialización de dbcontext tanto en NinjectDependencyResolver () como en MyManager. Para esto, obtienes dos excepciones diferentes. Este es un problema de diseño de plataforma, supongo


MyManager eliminar esta inicialización en MyManager ya que pasa el DbContext inicializado a través de IoC.

DbContext _dbContext=new DbContext("someParameter","connectionstring");

También necesita eliminar el bloque finally en GetDataTable en la clase MyManager ya que, como regla general, si el objeto se inicializa a través de IoC, también debe ser destruido por IoC.

finally{_dbContext.Close()}