누구나 Autofac이 NHibernate ISession 인스턴스 (ASP.NET MVC 애플리케이션의 경우)를 어떻게 관리 할 수 있는지에 대한 조언이나 모범 사례가 있습니까?Autofac으로 NHibernate Session을 관리하기
답변
NHibernate 세션을 처리하는 방법에 지나치게 친숙하지 않습니다. 즉, Autofac은 인스턴스 수명이 매우 뛰어납니다 (scoping 및 deterministic disposal). 관련 리소스는 this article 및 this question입니다. ASP.Net MVC에 있으니 the MVC integration stuff도 확인하십시오. 작업이 상당히입니다
public class SomeController
{
private readonly Func<Owned<ISession>> _sessionFactory;
public SomeController(Func<Owned<ISession>> sessionFactory)
{
_sessionFactory = sessionFactory;
}
public void DoSomeWork()
{
using (var session = _sessionFactory())
{
var transaction = session.Value.BeginTransaction();
....
}
}
}
컨테이너 설정이 얻을 :
점을 설명하기 위해, 여기 당신이 Autofac 공장 위임을 사용하는 방법에 대한 빠른 샘플 및 인스턴스의 수명을 완전히 제어를 얻을 제네릭 Owned
입니다 단순한. 우리가 Func<>
및 Owned<>
유형을 얻기 위해 아무것도 할 필요가 없습니다 공지 사항, 이들은 Autofac에 의해 자동으로 사용할 수 있습니다 :
builder.Register(c => cfg.BuildSessionFactory())
.As<ISessionFactory>()
.SingleInstance();
builder.Register(c => c.Resolve<ISessionFactory>().OpenSession());
업데이트 : 내 추론이 여기, 그 this NHibernate tutorial의 수명에 따라 세션 인스턴스는 "작업 단위 (UOW)"의 인스턴스 여야합니다. 따라서 세션 인스턴스가 생성 될 때와 세션이 폐기 될 때를 모두 제어 할 수있는 방법이 필요합니다.
Autofac으로 유형 대신 직접 Func<>
을 요청하여이 제어 권한을 얻습니다. Func<>
을 사용하지 않으면 컨트롤러 인스턴스를 만들기 전에 세션 인스턴스를 먼저 만들어야합니다.
다음으로, Autofac의 기본값은 인스턴스의 컨테이너 수명이 있다는 것입니다. 작업 단위가 완료되는 즉시이 인스턴스를 처리 할 권한이 필요하다는 것을 알고 있으므로 Owned
인스턴스를 요청합니다. 소유 인스턴스를 폐기하면이 경우 기본 세션이 즉시 폐기됩니다.
편집 : Autofac 및 다른 컨테이너와 같은 소리로 수명이 올바르게 적용될 수 있습니다. 그렇다면 가서 해봐.
IoC 컨테이너를 사용하여 세션을 직접 관리하는 것은 좋지 않습니다. 세션의 수명은 작업 단위 (트랜잭션 경계)와 일치해야합니다. 웹 응용 프로그램의 경우 웹 요청의 수명이 거의 확실합니다.
가장 일반적인 방법은 HttpModule을 사용하여 세션을 생성하고 요청이 시작되면 트랜잭션을 시작한 다음 요청이 완료되면 커밋합니다. HttpModule은 HttpContext.Items 컬렉션에 세션을 등록하게합니다.
IoC 컨테이너에서 ISessionLocator에 대해 HttpContextSessionLocator와 같은 것을 등록 할 수 있습니다.
일반적인 오류 처리는 현재 세션을 찾고 트랜잭션을 자동으로 롤백해야하며 그렇지 않으면 작업 단위의 절반을 커밋 할 수 있습니다.
* 왜 * 좋은 생각이 아닌가요? –
James와 동의하면, 작업 팩토리 유닛을 my (asp.net mvc) 컨트롤러에 삽입하고 필요한 경우 컨트롤러 내부에서 작업 단위를 생성합니다. 이 팩토리는 IoC 컨테이너 (구조체 맵) 주변의 래퍼 클래스 (서비스 로케이터)입니다. – AwkwardCoder
@AWC : 정확히 무엇을 할 것인가.Autofac 컨테이너가 OOTB를 제공한다는 것입니다. –
- 1. NHibernate와 Autofac으로 여러 데이터베이스 관리하기
- 2. Moq를 사용하여 NHibernate Session을 조롱
- 3. 구체적인 인스턴스를 관리하기 위해 StructureMap 또는 Session을 사용해야합니까?
- 4. Autofac으로 무엇이 장단점이 될까요?
- 5. 구조체에 의해 HttpContextScoped 인 NHibernate Session을 얻는 방법
- 6. NInject와 함께 스폰 된 스레드에서 NHibernate Session을 범위 지정
- 7. Fluent NHibernate - SessionFactory/Session을 관리하기위한 완벽한 헬퍼 클래스?
- 8. NHibernate, Lazy Loadind 및 Session을 싱글 톤으로 사용
- 9. NameValueCollection을 Autofac으로 해결할 수 없습니다.
- 10. 모든 것이 nhibernate (orm)에서 사용자와 관련이있을 때 클래스 관리하기
- 11. Autofac으로 WebOperationContext를 주입하는 WCF 편안한 서비스
- 12. NHibernate로 업데이트 관리하기
- 13. API로 IPTables 관리하기 PHP
- 14. 많은 주에서 활동 관리하기
- 15. GNU에서 간단한 변수 관리하기
- 16. Apache/PHP에서 Nonce 관리하기
- 17. Devise로 관리자 관리하기
- 18. MediaWiki에서 사용자 생성 관리하기
- 19. iboutlet없이 IB 객체를 관리하기
- 20. Ajax에서 브라우저 기록 관리하기
- 21. 프로젝트의 Ruby 의존성 관리하기
- 22. Vbox에서 hbox 관리하기 flex
- 23. PHP로 애니메이션 이미지 관리하기
- 24. Git에서 릴리스 지점 관리하기
- 25. 스칼라로 상태 관리하기
- 26. 유니티와 NHibernate
- 27. NHibernate의 View 패턴에서 Open Session을 구현하는 방법은 무엇입니까?
- 28. 웹 응용 프로그램 (특히 MVC)에서 NHibernate Session을 열고 닫을 위치는 어디입니까?
- 29. 기본 키에 의해 검색되지 않는 캐시 엔티티에 NHibernate Session을 가져 오는 방법
- 30. 매우 바쁜 변수를 분쇄하고 관리하기
흠 ... 사람들이 downvote 때 건설적인 비판을 줄 것이 좋겠다. –
저도 그래요! :) 답변 주셔서 감사합니다 - 귀하의 제안을 살펴 보겠습니다 – UpTheCreek
안녕하세요, Func의 모든 것을 여기에서 이해합니다 <소유 한> - 왜 이것을 사용합니까? 왜 그냥 표준 Session에 주입하지 않을까요? 나는 func/Owned가 실제로 무엇을하는지 잘 모르겠다.하지만 autofac 문서에 따르면, 당신이 그것을 사용한다면 수동으로 객체를 처리해야만 하는가?
UpTheCreek
http://code.google.com/p/autofac/wiki/NewInV2 –