2010-05-08 7 views

답변

18

NHibernate 세션을 처리하는 방법에 지나치게 친숙하지 않습니다. 즉, Autofac은 인스턴스 수명이 매우 뛰어납니다 (scopingdeterministic disposal). 관련 리소스는 this articlethis 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 인스턴스를 요청합니다. 소유 인스턴스를 폐기하면이 경우 기본 세션이 즉시 폐기됩니다.

+1

흠 ... 사람들이 downvote 때 건설적인 비판을 줄 것이 좋겠다. –

+0

저도 그래요! :) 답변 주셔서 감사합니다 - 귀하의 제안을 살펴 보겠습니다 – UpTheCreek

+0

안녕하세요, Func의 모든 것을 여기에서 이해합니다 <소유 한 > - 왜 이것을 사용합니까? 왜 그냥 표준 Session에 주입하지 않을까요? 나는 func/Owned가 실제로 무엇을하는지 잘 모르겠다.하지만 autofac 문서에 따르면, 당신이 그것을 사용한다면 수동으로 객체를 처리해야만 하는가? Owned 에 대한 참조를 얻은 구성 요소가 Ownted 을 호출 할 책임이 있습니다. 인스턴스가 더 이상 필요하지 않을 때 사용하십시오. 소유 인스턴스를 정리하지 않는 버그입니다. http://code.google.com/p/autofac/wiki/NewInV2 – UpTheCreek

0

편집 : Autofac 및 다른 컨테이너와 같은 소리로 수명이 올바르게 적용될 수 있습니다. 그렇다면 가서 해봐.

IoC 컨테이너를 사용하여 세션을 직접 관리하는 것은 좋지 않습니다. 세션의 수명은 작업 단위 (트랜잭션 경계)와 일치해야합니다. 웹 응용 프로그램의 경우 웹 요청의 수명이 거의 확실합니다.

가장 일반적인 방법은 HttpModule을 사용하여 세션을 생성하고 요청이 시작되면 트랜잭션을 시작한 다음 요청이 완료되면 커밋합니다. HttpModule은 HttpContext.Items 컬렉션에 세션을 등록하게합니다.

IoC 컨테이너에서 ISessionLocator에 대해 HttpContextSessionLocator와 같은 것을 등록 할 수 있습니다.

일반적인 오류 처리는 현재 세션을 찾고 트랜잭션을 자동으로 롤백해야하며 그렇지 않으면 작업 단위의 절반을 커밋 할 수 있습니다.

+4

* 왜 * 좋은 생각이 아닌가요? –

+1

James와 동의하면, 작업 팩토리 유닛을 my (asp.net mvc) 컨트롤러에 삽입하고 필요한 경우 컨트롤러 내부에서 작업 단위를 생성합니다. 이 팩토리는 IoC 컨테이너 (구조체 맵) 주변의 래퍼 클래스 (서비스 로케이터)입니다. – AwkwardCoder

+0

@AWC : 정확히 무엇을 할 것인가.Autofac 컨테이너가 OOTB를 제공한다는 것입니다. –

관련 문제