2013-04-18 2 views
1

(내가 원하는 것을 가리키는 어떤 문서도 찾지 못했기 때문에이 질문에 대해서는 조금 희망이 없습니다.) 어쨌든Appdomain bondaries를 통해 ISessionFactory 객체

:

AppDomain의 여러 사이에 하나의 ISessionFactory (SessionFactoryImpl)를 공유 할 수있는 방법이 있습니까?

- 또는 -

가이 ISessionFactory에서 ISession의를 생성하고 다른 Appdomain에 새 창조 ISession를 직렬화 할 수 있습니까?

- 또는 - 윈폼 기반 응용 프로그램에서

, 성공 스토리는 시간과 메모리 소비를 시작하지에 대해 약 ISessionFactory/ISession 관리 무엇입니까?

긴 이야기 (세부 사항을 선호하는 사람들을 위해) :

  • 내 응용 프로그램이 ERP 윈폼 기반 캔 급부상 여러 '하위 애플리케이션'이다 (형태);
  • 각 하위 응용 프로그램은 자체적으로 어셈블리가 있으며 독립적으로 업데이트 할 수 있습니다.
  • 새 AppDomain을 생성하면 각 하위 응용 프로그램의 구성원을 static 격리 할 수 ​​있습니다. 응용 프로그램이 끝나면 AppDomain 하위 프로그램도 언로드 할 수 있습니다. 우리는 잠시 동안 그랬지만, SessionFactory가 값 비싸기 때문에 (시간과 메모리를 중심으로),이 모델은 계속 유지 될 수 없게되었습니다. (지금은 스레드와 ThreadStatic 회원이 각 하위 애플리케이션의 특정 정보를 보유하기 위해);
  • 우리는 Lazy-loading을 꽤 많이 사용하고 있으므로이 기능도 포기할 수 없습니다. 나는이 (왜 기억이 안나요) 동작하지 않습니다 수 있지만 ISessionFactory를 직렬화하는 것은이 발생할 것이다 다음 ISessionFactory을 공유

    • MarshalByRef 클래스 :

    난 이미 시도 무엇 메모리 (큰 금액)의 복제 어쨌든. 내가 맞습니까? ISession 급부상하고 다른 AppDomain에 직렬화

  • MarshalByRef 클래스 : ISession 부모 ISessionFactory에 속성을 보유하고 있기 때문에, 즉 다른 경계에 지금, 그것은 나에게 일부 속성이 정의되지 않은 말해 멋진 expcetions을 가져왔다.

답변

1

Winforms 응용 프로그램을 사용한 저의 성공 사례는 응용 프로그램을 처음 실행할 때 구성을 직렬화하고 연속 된 파일을 연속 실행시로드한다는 것입니다. 이렇게하면 응용 프로그램 시작 시간이 크게 줄어 듭니다. 첫 번째 실행시 지연을 없애기 위해 직렬화 된 구성으로 애플리케이션을 배포하는 것이 가능할 수도 있습니다.

private const string SERIALIZED_CONFIG = "configuration.bin"; 

    private Configuration GetConfiguration() 

     Configuration config = null; 
     config = LoadConfigurationFromFile(); 

     if (config == null) 
     { 
      // Create a new configuration, code omitted 
      config = fluentConfig.BuildConfiguration();    
      SaveConfigurationToFile(config); 
     } 
    } 

    private Configuration LoadConfigurationFromFile() 
    { 
     try 
     { 
      if (!IsConfigurationFileValid()) 
      { 
       return null; 
      } 

      using (var file = File.Open(SERIALIZED_CONFIG, FileMode.Open)) 
      { 
       var bf = new BinaryFormatter(); 
       return bf.Deserialize(file) as Configuration; 
      } 
     } 
     catch (Exception ex) 
     { 
      return null; 
     } 
    } 

    private bool IsConfigurationFileValid() 
    { 
     if (!File.Exists(SERIALIZED_CONFIG)) 
     { 
      return false; 
     } 

     var configInfo = new FileInfo(SERIALIZED_CONFIG); 

     // Assumes all assemblies are in same location and written at same time 
     var asm = _assemblies.First(); 
     var asmInfo = new FileInfo(asm.Location); 

     if (asmInfo.LastWriteTime > configInfo.LastWriteTime) 
     { 
      return false; 
     } 
     return true; 
    } 

    private void SaveConfigurationToFile(Configuration config) 
    { 

     using (var file = File.Open(SERIALIZED_CONFIG, FileMode.Create)) 
     { 
      var bf = new BinaryFormatter(); 
      bf.Serialize(file, config); 
     } 
    } 
+1

이 단지 SessionFactory를 작성하는 시간을 줄일 수 있지만 메모리 소비 :

직렬화는 다음과 같이 보인다. 그리고 기억은 OP의 가장 큰 쟁점 인 것 같습니다. – cremor

+0

+1 코드 샘플. 고마워요. 나는 이미이 가능성을 알고있다. (NHiberante Cfg Serialization) - 웹에 몇 가지 예가있다. 그러나 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 있습니다. 어쨌든 신속한 답변을 해주셔서 감사합니다. :) –