다음 시나리오에서 저를 교정하십시오. (질문 끝남)ISession을 저장소에 정확하게 주입하는 방법은 무엇입니까?
(비슷한 질문을했는데 정리가 안되었습니다.이 질문을 정확한 대답으로 대답 할 수있는 범위로 요약했습니다.)
ORM으로 nhibernate를 사용하여 여러 레이어가있는 웹 응용 프로그램을 개발 중입니다. 상기 레이어
- 모형 층
- 저장소 계층
- 서비스 계층
- UI 계층
, 클래스 및 인터페이스는 아래와 같이 배치를 다음과 같이 내 층 구조이다.
ProductController.cs (UI 계층)
public class ProductController : Controller
{
ProductServices _ProductServices;
NHibernate.ISession _Session;
public ProductController()
{
_Session = SessionManager.GetCurrentSession();
_ProductServices = new ProductServices(
new ProductRepository(), _Session);
}
// Cont..
}
ProductServices.cs (서비스 계층)
public class ProductServices : IProductServices
{
protected IProductRepository _ProductRepository;
protected NHibernate.ISession _Session;
public ProductServices(IProductRepository productRepository,
NHibernate.ISession session)
{
_ProductRepository = productRepository;
_Session = session;
_ProductRepository.SetSession(_Session);
}
// cont...
}
ProductRepository.cs (리포지토리 레이어)
public class ProductRepository : IProductRepository
{
NHibernate.ISession _Session;
public void SetSession(NHibernate.ISession session)
{
_Session = session;
}
public IEnumerable<Product> FindAll()
{
return _Session.CreateCriteria<Product>().List<Product>();
}
//cont..
}
UI 레이어에서 세션 당 요청을 만들고 클래스 생성자의 도움을 받아 서비스 레이어에 삽입합니다. 그런 다음 방법의 도움으로 저장소 세션을 설정하십시오.
_Session을 생성자로 직접 리포지토리에 전달하면 서비스 계층 아래에서 해당 컨트롤을 제어 할 수 없습니다. 또한 webservice 레이어를 사용하기위한 향후 확장 계획이 있습니다.
** 코드가 인 각각의 메서드를 동일한 코드를 반복 할 때 각 메서드에 if(_Session==null)
작성하지 않고도 이미 설정된 ProductRepository 클래스에서 보장 할 수있는 방법이 있습니까?
** 위의 패턴이 잘못되면이 목표를 달성하기위한 올바른 방법을 보여주십시오.
[여기에 몇 가지 일반적인 조언이 있습니다] (http://stackoverflow.com/questions/10585478/one-dbcontext-per-web-request-why) 당신의 세션을 위해 선택할 라이프 스타일. – Steven
이것은 단지 주석 일뿐입니다. nhibernate는 이미 저장소/작업 단위 패턴을 수행하고 있으며 코드는 쓸모없는 계층을 추가하는 것입니다. http://ayende.com/blog/153701/ask-ayende-life-without-repositories-are-they-worth-living –