3

전 윈저, 뉴 버 네이트, 플루 언트 및 오토 맵핑 스태킹에 익숙하지 않아서 여기 내 무지를 변명하십시오. 나는 이미 Windsor nhib Isession 관리 문제에 대한 해결책을 얻으려는 많은 질문이 있지만 이미 그들 중 누구도 내 문제를 해결하지 못했기 때문에 이것에 대한 다른 질문을 게시하고 싶지 않습니다. 내 저장소에서 Db를 호출하려고 할 때 여전히 예외가 닫히고 있습니다. 여기에 컨테이너 설정 코드가 있습니다. 내 저장소에서Castle Windsor, Fluent Nhibernate 및 Automapping Isession 폐회 문제

container.AddFacility<FactorySupportFacility>() 
      .Register(
       Component.For<ISessionFactory>() 
        .LifeStyle.Singleton 
        .UsingFactoryMethod(() => Fluently.Configure() 
                .Database(
                 MsSqlConfiguration.MsSql2005. 
                  ConnectionString(
                   c => c.Database("DbSchema").Server("Server").Username("UserName").Password("password"))) 
                .Mappings 
                (
                 m => 
                 m.AutoMappings.Add 
                 (
                  AutoMap.AssemblyOf<Message>(cfg) 
                  .Override<Client>(map => 
                  { 
                   map.HasManyToMany(x => x.SICCodes).Table("SICRefDataToClient"); 
                  }) 
                  .IgnoreBase<BaseEntity>() 
                  .Conventions.Add(DefaultCascade.SaveUpdate()) 
                  .Conventions.Add(new StringColumnLengthConvention(),new EnumConvention()) 
                  .Conventions.Add(new EnumConvention()) 

                  .Conventions.Add(DefaultLazy.Never()) 
                 ) 
                ) 
                .ExposeConfiguration(ConfigureValidator) 
                .ExposeConfiguration(BuildDatabase) 
                .BuildSessionFactory() as SessionFactoryImpl), 
       Component.For<ISession>().LifeStyle.PerWebRequest.UsingFactoryMethod(kernel => kernel.Resolve<ISessionFactory>().OpenSession() 
               )); 

은 내가 private readonly ISession session;을 주입하고 <httpModules> 안에 내 Web.config의에서

public User GetUser(int id) 
    { 
     User u; 

      u = session.Get<User>(id); 
      if (u != null && u.Id > 0) 
      { 
       NHibernateUtil.Initialize(u.UserDocuments); 
      } 


     return u; 

을 followes로 사용합니다. 나는 또한이 nHibernate 수있는 모든 웹 응용 프로그램 개발의 기본적인 필요를 위해 구성 같은 복잡한 일이라고 믿을 수 없어,이 라인

 <add name="PerRequestLifestyle" 
type="Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule, Castle.Windsor"/> 

내가 아직 여기 퍼즐의 일부를 누락을 추가 한 성 윈저.

나는 여기에 코드 windsor-nhibernate-isession-mvc을 따르려고 노력해 왔고 똑같은 문제가있는 것으로 보였으 나 거기에서 내 질문을 게시했지만 내 문제가 해결되지 않았습니다.

UPDATE MooKid8000 내가 지금이

private void AddRepositories() 
    { 
     container.Register(
      AllTypes.FromAssembly(typeof(MembershipRepository).Assembly) 
       .Pick() 
       .Configure(c => c.Interceptors(
        InterceptorReference.ForKey("simpleLogger")).Anywhere 
       ) 
       .Configure(c => c.LifeStyle.Is(LifestyleType.Transient)) 
       .WithService.FirstInterface()); 
    } 

에 내 성 레지스터 코드를 업데이트하지만 여전히 ISession 받고 있어요 나의 서비스뿐만 아니라 일시적으로 등록해야합니까, 폐쇄 문제가있다 그들은 일시적이어야하며 왜 더 자세히 설명 할 수없는 싱글의

MooKid8000의 제안, 난 그냥 있는지 내 서비스와 reposit를 만들 필요가 100 % 정확했다 UPDATE ories는 LifestyleType.Transient로 범위가 지정되었으므로 ISession이 지워지지 않았습니다. 처음에는 성 성 등록 코드를 보지도 않고 멋진 곳 Mookid8000.

나를 위해 intrested 누구든지 내게 연락하고 나는 당신에게 내 컨테이너 설치를 보낼 수 있습니다.

+1

ASP.NET MVC와 NHibernate를 사용하는 Windsor 튜토리얼을 살펴보고 Windsor 또는 IoC 개념에 대한 사전 경험이없는 사람들을 대상으로 할 수 있습니다. http://stw.castleproject.org/Windsor.Windsor-tutorial-ASP-NET-MVC-3-application-To-be-Seen.ashx 무엇이 명확하지 않거나 혼란 스럽거나 잘 설명되지 않으면 튜토리얼에 대한 의견을 공유하는 것을 잊지 마십시오 –

+0

유창한 구문이 최악입니다. 나는 그 코드가하려고하는 것을 읽으 려하지 않을 것입니다. 죄송합니다. – Phill

+0

나중에 자세하게 살펴 보겠습니다. 마지막 몇 시간 동안 그런 asp.net MVC 3 예제를 검색 할 때였습니다. – Simon

답변

5

일시적인 라이프 스타일로 리포지토리를 등록하는 것을 잊지 않으셨습니까?

리포지토리가 싱글 톤 (Windsor의 기본 라이프 스타일) 인 경우 투입된 ISession 인스턴스가 "캐치"되어 나중에 닫힌 세션 오류가 발생합니다.

리포지토리를 사용하는 모든 서비스에는 일시적인 라이프 스타일과 해당 서비스를 사용하는 서비스가 있어야한다는 점에 유의하십시오.

일반적으로 컴포지션 루트에서 멀어 질수록 라이프 스타일 세분성이 증가하지 않아야한다고 말할 수 있습니다. 그렇지 않으면 어떤 종류의 범위 지정이 발생합니다. 물론 이것이 항상 문제는 아니지만 진단하기가 매우 어려운 오류를 유발할 수 있습니다.

+0

내 주요 질문을 업데이트했습니다. 그래서 더 많은 코드를 추가 할 수는 있지만 여전히 DB에 접근하려고 할 때 ISession이 닫히는 것입니다. – Simon

+0

Ok -하지만 저장소에 종속 된 서비스는 어떻습니까? 내 생각에 요청 당 범위가 'ISession'은 우연히 싱글 톤으로 범위가 지정되며, 이는 보통 여러분이 겪고있는 오류를 가져옵니다. – mookid8000

+1

mookid 그게 다예요. LifestyleType.Transient로서의 모든 서비스를 스코프로 고정 시켰습니다. 저장소를 때면 ISession이 살아 있었고, 지금은 게으른 로딩을 되돌릴 수 있습니다 .--), 너무나 감사합니다. 간단하지만 당신이 모든 것을 처음 접할 때는 매우 어렵습니다. 성에 대한 더 많은 독서를해야합니다. 많은 것에 대해 감사드립니다. 문자 그대로 3 주 동안 머리카락을 찢어 버렸습니다. – Simon