문제

나는 새로운 NHibernate(및 ORMS)하고 제거하는 수많은 다른 옵션의를 제공하고 있습니다.참조를 위해 사용하고 유창한 NHibernate 별도의 비즈니스 객체는 사용 DTO 의 순수를 위한 데이터에 액세스 할 수 있습니다.내 애플리케이션 아키텍처는 모두 지원해야 합 windows 웹"front end".

내 quandry 은 하나의 일반적인 접근 방식으로 보실 수 있습니다 그래서 많은 옵션이 있습니다.내 DTO 의 모습 같은 것 아래 샘플.각 DTO 에 대한 참조가 있는 isession 은 다음 전달되는 그들을 에서 BO.그에 대한 책임은 자신의 부하를 저장:

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)...

먼저: 이것이 올바른 접근 방식을 취해야한 DTO 을 저장할 수있는 능력을 가지고 자신을 로드?

둘째: 에 관계없이 어디로드/저장 코드는 거짓말을 사용해야 하는 동 isession 은 다음을 위해 평생 또는 개체,또는 한다 그들은 심판에게 ISessionFactory 과 새로운 세션의 모든 시간을 데이터베이스 작업이 필요?

    // 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

물론 항상있는 옵션 3,위의 아무도:)

도움이 되었습니까?

해결책

일반적으로 DTO에는 동작 (예 : 저장,로드)이 포함되어 있지 않으며 지속되는 방법에 대한 지식이 포함되어 있지 않습니다 (ISESSION). 당신이 실제로 만드는 것은 데이터 계층 인 것 같습니다. 귀하의 비즈니스 계층은 이상적으로 ISSESSION에 대해 알지 못해야합니다. 즉, 귀하는 귀하의 요구에 맞는이 레이어링을 단축시킬 수 있지만, 모든 레이어를 통해 ORM이 피가 피는 경우 나중에 다른 ORM으로 변경하기가 어려울 수 있습니다.

Issession Lifetime Management의 경우, 기본적으로 모든 사용자 요청이 새로운 issession을 얻는다 고 말하는 Unitofwork 패턴을 사용할 것인지 결정해야합니다. Issession Lifetime에 대한 다른 옵션도 있으며, 당신은 실제로 그와 관련하여 제한되지 않습니다. 종종 웹 앱과 Windows 앱과 다른 응용 프로그램 유형에 대한 모범 사례가있을 수 있지만 작성한 내용을 지정하지는 않았습니다.

다른 팁

로드/저장 코드를 DTO와 별도로 유지하십시오. DTO 객체는 전용입니다 견해 기본 데이터의.

쿼리를 수행 할 때 변환을 사용하여 DTOS를 반환하십시오. 이 같은:

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

DTO는 "데이터 전송 개체"입니다. 즉, 시스템에서 주변의 값을 전달하는 데 사용되는 멍청한 물체입니다. 도메인 계층의 도메인 객체에 1-1을 맵핑 할 책임이 없어야합니다.

이 isession 은 다음은 매우 저렴하기로 열기/닫습니다.문제는 그것을 유지 너무 오랫동안 열려있는 연결을 풀 수 있는지 다시 연결할 때까지 그것은 또 무엇인지 않습니다.이 문제가 될 수 있에서 다중 사용자 응용 프로그램.

시나리오에서 나는 아마 이동에 대한 서비스 중심의 접근 방식을 저장할 데이터를 검색합니다.을 의미 DTO 는 것만이 내부적으로 사용되 내에서 서비스합니다.을 복사해야 하는 경우 객체를 보이는 동안 당신을 봐야 AutoMapper 을 위해 만들어진 이는 특정 목적입니다.이 있는 경우 윈도우에만 또는 웹서만 프로젝트는 다음 그것이 문제가되지 않습니다.그 때 당신은 혼합한다.당신을 처리할 수 없습니다 세션에서 동일한 방법 윈도우에서와 같이 응용 프로그램을 웹 응용 프로그램입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top