Pregunta

He usado bloques en cada método de mi repositorio. Si quiero cruzar métodos de referencia, parece que sería contra las mejores prácticas inicializar otro Datacontext ¿Qué estoy haciendo mal? Si declaro un Datacontext en la clase en lugar de usar bloques en los métodos, ¿no perderé energía para deshacerme?

public IList<something> GetSomething()
{ 
   using (DB db=new DB())

   { ...GetListofSomethingElse(id)

   } 
}

public IList<somethingelse> GetListofSomethingElse(int id)
{ 
    using (DB db=new DB())
   {
     ... return IList 

   } 
}
¿Fue útil?

Solución

Si no usa una declaración de uso, aún puede disponer explícitamente. Sin embargo, incluso si no dispone del contexto de datos, la referencia cruzada de estos métodos seguirá creando un nuevo contexto de datos. Eso puede o no ser algo bueno, dependiendo de su uso. Piense en el aspecto de administración de estado del contexto de datos y si desea aislar los métodos entre sí o no. Si desea evitar crear un nuevo contexto todo el tiempo, sobrecargue los métodos con versiones que tomen el contexto como parámetro.

Tenga en cuenta que generalmente no necesita para eliminar un contexto de datos , aunque tiendo a eliminar cualquier cosa que implemente IDisposable.

Otros consejos

En realidad, creo que es semánticamente (o cómo debería decir eso), no es correcto crear y eliminar un contexto de datos en su repositorio.

Quiero decir: si abres una nueva conexión a la base de datos en todos y cada uno de los métodos de tu repositorio, lo estás haciendo mal en mi humilde opinión. Esto es demasiado fino. La clase de repositorio no tiene conocimiento del 'contexto' en el que se está utilizando. Su repositorio no debe ser responsable de abrir / cerrar conexiones o de iniciar y confirmar transacciones. El contexto es el rey, y el repositorio no tiene conocimiento del contexto en el que se está utilizando. Entonces, en mi humilde opinión, es responsabilidad de la capa de aplicación o de la capa de servicio abrir nuevos objetos de DataContext y cerrarlos / eliminarlos. (Lo mismo se aplica a las transacciones).

Entonces, así es como lo hago: (tenga en cuenta que no uso el Entity Framework, pero uso NHibernate. Asumo que la clase DataContext en el EF es similar a la ISession en NHibernate):

using( ISession s = theSessionFactory.OpenSession() )
{
    ICustomerRepository cr = RepositoryFactory.GetCustomerRepository(s);

    Customer c1 = cr.GetCustomer(1);
    Customer c2 = cr.GetCustomer(2);

    // do some other stuff
    s.StartTransaction();

    cr.Save (c1);
    cr.Save (c2);

    s.Commit();

}

(Esto no es código de salida del mundo real; y ni siquiera se compilará ya que ISession no tiene un método Commit.;) En cambio, StartTransaction devuelve una ITransaction que tiene algún tipo de método commit, pero Creo que me entenderás. ;))

La declaración de uso es azúcar sintáctico. Se compila en un bloque try / finally con la llamada Dispose () en la sección finally. Asegura que se llamará a Dispose incluso si ocurre una excepción.

Puede llamar a .Dispose () en una clase sin usar una instrucción 'using'; generalmente lo hará en el método Dispose de su repositorio, si tiene uno.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top