Pergunta

Eu tenho usando blocos em cada método de meu repositório. Se eu quiser atravessar métodos de referência, parece que seria contra as melhores práticas para inicializar outra Datacontext O que estou fazendo de errado? Se eu declarar uma Datacontext na classe em vez de usar blocos em métodos irá eu não poder perder a dispor ??

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

   { ...GetListofSomethingElse(id)

   } 
}

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

   } 
}
Foi útil?

Solução

Se você não usar a instrução usando, você ainda pode descartar explicitamente. Mesmo se você não descarte o contexto de dados, porém, referência cruzada estes métodos irá ainda criar um novo contexto de dados. Isso pode ou não pode ser uma coisa boa, dependendo do seu uso. Pense sobre o aspecto de gestão estado do contexto de dados, e se você deseja isolar os métodos do outro ou não. Se você quiser evitar a criação de um novo contexto o tempo todo, sobrecarregar os métodos com versões que levam o contexto como um parâmetro.

Note que você não costuma necessidade de dispor de um contexto de dados , embora eu tendem a dispor de qualquer coisa implementar IDisposable.

Outras dicas

Na verdade, eu acho que é semanticamente (ou como eu deveria dizer isso), não é correto para criar e descartar um datacontext em seu repositório.

Quer dizer: se você abrir uma nova conexão com o DB em cada método de seu repositório, você está fazendo isso IMHO errado. Isso é demais grão fino. A classe repositório tem nenhum conhecimento do 'contexto' em que ele está sendo usado. Seu repositório não deve ser responsável por abrir / fechar conexões ou iniciar e confirmar transações. Contexto é rei, eo repositório não tem conhecimento do contexto em que ele está sendo usado. Então, IMHO é a responsabilidade da camada de aplicativo ou camada de serviço para novos objetos DataContext abertas, e fechando / descartá-los. (O mesmo se aplica para as operações).

Então, isso é como eu faço isso: (note que eu não usar o Entity Framework, mas eu uso NHibernate Eu suponho que a classe DataContext no EF é semelhante ao ISession em 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();

}

(Isto não é o código do mundo real offcourse; e não vai mesmo compilar desde ISession não tem um método Commit;.) Em vez disso, o StartTransaction retorna um ITransaction que tem algum tipo de cometer método, mas Eu acho que você me entende. ;))

A instrução using é açúcar sintático. Ele compila a um try / finally bloco com a chamada Dispose () na finalmente seção. Ele garante que Dispose será chamado, mesmo se ocorrer uma exceção.

Você pode chamar .Dispose () em uma classe sem usar um 'usando' declaração -. Normalmente você vai fazer isso no método Dispose de seu repositório, se você tem um

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top