2009-09-21 3 views
2

DDD 방식을 사용하여 ASP.NET MVC 어플리케이션에서 NHibernate를 설정하려고합니다. 그러나 객체 관련 객체를 게으른로드하려고 할 때 오류가 발생합니다. Heres는 내 응용 프로그램을 구성했습니다 방법 :NHibernate : "느리게 초기화하지 못했습니다 ...", DDD 접근

인프라 층 : 매핑 파일 저장소 구현 및 구성하고 세션 공장을 건설하는 NHibernate에 부트 스트 래퍼를 포함합니다. Heres는 저장소 예를

:

public class CustomerRepository : ICustomerRepository 
{ 
    public Customer GetCustomerById(int customerId) 
    { 
     using (var session = NHibernateBootstrapper.OpenSession()) 
      return session.Get<Customer>(customerId); 
    } 
} 

도메인 층 : 서비스 구현을 포함합니다 : 간단한 POCO 클래스, 저장소 및 서비스 인터페이스

응용 프로그램 계층이 있습니다.

Heres는 서비스 예 :

public class CustomerService : ICustomerService 
{ 
    private ICustomerRepository _repository; 

    public CustomerService(ICustomerRepository repository) 
    { 
     _repository = repository; 
    } 

    public Customer GetCustomerById(int customerId) 
    { 
     return _repository.GetCustomerById(customerId); 
    } 
} 

프리젠 테이션 층 : 는 ASP.NET MVC 응용 프로그램을 포함합니다. 그리고 이것이 내 문제를 발견 한 곳입니다. MVC 접근 방식을 사용하여 CustomerService 서비스를 사용하여 고객을 얻고 View (강하게 입력 된)에 고객을 표시하는 컨트롤러가 있습니다. 이 고객은 관련 엔터티 Contact를 가지고 있으며 Model이 Customer 객체 인 Model.Contact를 사용하여 View에서 액세스하려고하면 LazyInitializationException이 발생합니다.

나는 이것을 얻는 이유를 안다. CustomerRepository에서 Customer를 검색하는 데 사용 된 세션이 지금 죽어 있기 때문입니다. 문제는 어떻게 해결할 수 있을까입니다. 연락처 데이터가 아니라 고객 데이터 만 필요하기 때문에 저장소에있는 고객의 관련 Contact 엔티티를 가져 오는 것을 피할 수 있다면 좋겠다. 이것이 가능하다면?

그래서 질문 : 프리젠 테이션 계층이 관련 엔터티를 필요로 할 때까지 데이터베이스 쿼리를 기다릴 수 있습니까? 연락처?

내가 필요한 것은이 article이 묘사 한 것과 같다고 생각합니다. 인프라 계층에서 구현하는 방법이나 구현해야하는 위치를 파악할 수 없습니다.

미리 감사드립니다. 어떤 도움을 많이 주시면 감사하겠습니다!

답변

2

세션 관리의 경우 요청 당 단일 세션을 사용하는 것이 일반적입니다. 구현 예인 here을 볼 수 있습니다. 그것은 쉽게 Nhibernate의 도움으로 새로운 asp.net 응용 프로그램을 설치하도록 설계된 오픈 소스 프로젝트입니다. 소스 코드는 here을 설립 할 수 있습니다.

희망이 있습니다.

0

고객 클래스의 모든 속성 및 메서드가 virtual으로 표시되어 있습니까?

세션을 열고 닫는 방법은 무엇입니까? 나는 TransactionPerRequest이라고하는 ActionFilterAttribute을 사용하고 모든 컨트롤러를 장식합니다.

구현을 위해 this을 확인하십시오.

1

샤프 아키텍처 (Sharp Architecture)도 좋습니다.

또 다른 접근법은 제안뿐만 아니라 엔티티를 뷰에 전달하지 않는 것입니다. 세션 관리를 제외하고는 다른 문제가 있습니다. 비즈니스 규칙이 뷰로 유출되거나, 비대해진/spagetti 코드 등입니다. ViewModel 접근 방식을 사용하십시오.

세션에 엔티티를 저장하면 문제가 발생할 수 있습니다. 세션 [ "고객"]에서 고객을 얻으려고하면 동일한 예외가 발생합니다. 여기에 몇 가지 해결책이 있습니다. 예를 들어 ID를 저장하거나 세션에 저장할 객체의 지연로드를 막기 위해 저장소 메소드를 추가하는 것입니다. NHibernate의 SetFetchMode를 읽으십시오. 물론 엔터티를 전달할 수도 있습니다. 조회수. 그러나 내가 말했듯이 ViewModel 접근법을 더 잘 준수하십시오. Google for ViewModel 또는 http://code.google.com/p/codecampserver/의 코드 샘플을 사용하는 ASP.NET MVC In Action 책을 참조하십시오. 예를 들어, this도 읽으십시오.

관련 문제