2013-01-22 2 views
0

NHibernate (아마도 또한 Fluent하지만 재사용 할 수있는 클래스/프로젝트 데이터베이스를 작성하려고하지만 모든 솔루션에서 클래스/프로젝트를 추가 할 수 있습니다).NHibernate와 재사용 가능한 구성 요소를 작성하십시오

public class DataBase 
{ 
    private ISession _session; 
    private static DataBase _instance; 

    public static DataBase Instance 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       _instance = new DataBase(); 
      } 
      return _instance; 
     } 

    } 

    private DataBase(Assembly assembly) 
    { 
     var cfg = new Configuration(); 
     cfg.Configure(); 
     cfg.AddAssembly(assembly); 
     this._session = cfg.BuildSessionFactory().OpenSession(); 
    } 

    public void SaveAll<T>(IEnumerable<T> objects) 
    { 
     foreach (object obj in objects) 
     { 
      T specificObject = (T)obj; 
      _session.Save(specificObject); 
     } 
     _session.Flush(); 
    } 
} 

그러나 매개 변수 싱글은 좋은 생각이 아니다 :

나는이 코드를 가지고있다. 이 구성 요소를 만드는 가장 좋은 방법/패턴은 무엇입니까?

+0

왜 데이터베이스가 싱글 톤이되어야합니까? 하나만 있나요? 내가 두 명이라면? – nvoigt

답변

2

시간이 지나면 NHibernate.Cfg 네임 스페이스와 ISession 인터페이스가 노출하는 거의 모든 것을 DataBase 클래스가 노출 할 때까지 계속 작업 할 것으로 예상됩니다.

제 경험상 부트 스트래핑 코드는 일반적으로 프로젝트마다 다르고 재사용 할 수 없습니다 (많이).

결국 ISession API 및/또는 쿼리 메서드를 래핑하는 것은 좋은 생각이 아닙니다. 몇 년 동안 프로젝트와 몇 년 동안 사용하면 모든 것을 래핑해야하기 때문입니다.

요약하면 포장에주의하십시오. 캡슐화와 추상화은 코드가 중복을 피하고 이해하기 쉽게하기 위해 유용 할 수 있습니다. 또한 코드의 작은 부분에 대한 NHibernate 노출을 제한 할 수 있습니다.

+0

"구성 자동화"로 무엇을하려고하는지 잘 모르겠습니다. 매우 비슷한 프로젝트 세트를 가지고 있다면 초기화 코드를 공유하는 것이 도움이 될 수 있습니다. 중요한 것은 NHibernate를 랩핑하려고하는 것이 아니라 다른 프로젝트가 공유 부트 스트랩 코드를 적용하기 위해 (넓은 의미로) 오버라이드 할 수있는 확장 점을 제공하는 것이다. –

+0

감사합니다. 특별 프로젝트를 특정 클래스에 추가 할 것이다. 또한 구성을 자동화하고 도메인 클래스를로드하는 방법을 찾고 있는데, 매우 행복 할 것입니다. –

+0

"자동화"를 사용하면 각 프로젝트 구성 파일을 다시 작성하고 한 프로젝트에서 다른 프로젝트로 변경하는 것만으로 클래스 어셈블리를 수동으로 추가하고 싶지는 않습니다. 데이터베이스 엔진과 클래스이지만 설정 단계는 항상 같습니다. –

관련 문제