Pergunta

Eu sou novo para o NHibernate (e REALIZA), e tentar lidar com a miríade de diferentes opções que apresenta.Para referência, eu estou usando o Fluent NHibernate com a separar os objetos de negócios que por sua vez, utilize DTO puramente para acesso a dados.Meu arquitetura de aplicação deve suportar o windows e web "front-ends".

Meu quandry é uma abordagem geral como parece que há tantas opções.Meu DTO do parecer algo como o exemplo abaixo.Cada DTO tem uma referência a uma ISession que lhes é passado a partir do BO.Eles são responsáveis por suas próprias carregar e salvar:

public class EmployeeDTO...

    // Data Properties to be persisted to the database
    public virtual int Id { get; private set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual ISession Session { get; set; }

    // Save logic
    public virtual void Save()
    {
        var transaction = Session.BeginTransaction();
        Session.SaveOrUpdate(this);
        transaction.Commit();
    }

    // Load logic
    public virtual void Load(int id)...

Primeiro de tudo: Esta é a abordagem correta para tomar - se o DTO tem a capacidade de salvar e carregar em si?

Em segundo lugar: Independentemente de onde o guardar/carregar o código de mentiras, você deve usar o mesmo ISession para a vida ou um objeto, ou eles devem ter uma ref para o ISessionFactory e abrir uma nova sessão a cada banco de dados de tempo de interação é necessária?

    // Open a new session every time I interact with the repository
    var session = FluentSupport.SessionFactory.OpenSession();
    var transaction = Session.BeginTransaction();
    Session.SaveOrUpdate(this);
    transaction.Commit();
    session.Close();
    // Close the session when I'm done

Claro que há sempre a opção 3, nenhum dos acima :)

Foi útil?

Solução

Em geral, os DTOs não contêm comportamento (como Salvar, Carregar) e não contêm o conhecimento de como eles se persistentes (ISession).Parece que você realmente está criando uma camada de dados.Sua camada de negócios, idealmente, não deve saber sobre ISession quer.Dito isso, você pode atalho isso camadas de tudo o que você quer, como ele se encaixa às suas necessidades, mas ele provavelmente vai ser difícil mudar para outro ORM, mais tarde, se o seu ORM sangra através de todas as suas camadas.

Para ISession gerenciamento do tempo de vida, você tem que decidir se você vai usar o UnitOfWork padrão, que basicamente diz que a cada solicitação do usuário obtém uma nova ISession.Existem outras opções para ISession vida e você realmente não está limitado no que diz respeito.Muitas vezes, não podem ser melhores práticas em torno da web apps vs.aplicativos do windows vs.quaisquer outros tipos de aplicação, mas você não especificar que você estava escrevendo.

Outras dicas

Mantenha o seu carregamento/verão de código separado de seus DTOs.O DTO objetos são apenas pontos de vista de dados subjacente.

Ao fazer suas consultas, retorno a DTOs usando uma transformação.Algo como isto:

resultSet = session.CreateCriteria(typeof(MyDataObject))
    .Add(query criteria, etc.)
    .SetResultTransformer(Transformers.AliasToBean<MyDTOObject>())
    .List<IMyDTOObject>()

DTO do destinam-se a ser "objetos de transferência de dados".Isto é, objetos mudos usado para passar valores ou conjuntos de valores em torno de seu sistema.Eles não deveriam ser responsável para manter-se, ou mesmo mapa 1-1 para objetos de domínio em seu domínio de camada.

O ISession é muito barato para abrir/fechar.O problema com a mantê-lo aberto por muito tempo é que o pool de conexão não pode reutilizar a conexão até que o tempo limite ou que não.Isso pode ser um problema em uma aplicação multi-utilizador.

Na sua situação eu provavelmente vá para um serviço orientado para o armazenamento de recuperar dados.significado do DTO seriam utilizadas apenas internamente dentro dos limites de serviço.Se você precisa copiar objetos que têm a mesma aparência eu sugiro que você dê uma olhada em AutoMapper que foi criado para esse fim específico.Se você tem um windows só ou somente web project, em seguida, não é um problema.É quando você mistura.Você não pode manipular as sessões da mesma forma em um aplicativo do Windows como em um aplicativo da Web.

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