2008-09-18 3 views
3

NHibernate 기반 도메인 모델에서 멀티 테넌트 기능의 투명하고 유창한 지원을 구현하는 가장 좋은 전략은 무엇입니까? 멀티 임차인 아키텍처와 NHibernate

임 방법을 찾고, TenantID에 의해 필터링과 같은 멀티 테넌트 (multi-tenant) 물건에서 가능한 한 고립으로 도메인 로직을 유지하는 방법 등

답변

0

Ayende는 멀티 테넌시 (Multi-tenancy) 애플리케이션 구축에 대한 좋은 블로그 게시물이 있습니다. NHibernate가이를 위해 어떻게 사용되는지는 멀티 테넌시 유형에 따라 다릅니다.

+0

음, 간단한 공유 데이터베이스/스키마 접근법에 대해 이야기하고 있습니다. 대부분의 테이블에는 특별한 임차인 식별 열이 있습니다. 하지만 도메인 모델 레벨에서 나는이 속성들 중 어떤 것도보고 싶지 않을 것입니다. – noetic

+0

흠 ....이 경우 확실하지는 않지만 NHibernate 세션을 통해 필터를 설정할 수 있다는 것을 알지만 확실하지 않습니다 정확히 어떻게 작동하는지. 필자는 쿼리를 실행하고 쿼리에 필터를 넣지 않고 엔터티를로드 할 수 있다고 생각합니다. 이것은 당신이 원하는 것일 수 있습니다. – Gilligan

2

가장 간단한 방법은 각 클라이언트마다 다른 데이터베이스를 사용하는 것입니다.

이러한 방식으로 멀티 테넌트를 구현하면 단일 테넌트 애플리케이션을 효율적으로 작성하고 세션을 생성/검색하는 시점에서 멀티 테넌트에 대해서만 걱정할 수 있습니다.

아직 세부 사항을 깊이 파고 들지는 않았지만 (몇 달 후에 비슷한 작업이 필요합니다) 세션이 연결된 데이터베이스를 관리하는 가장 쉬운 방법은 사용자 지정 ISessionFactory 구현을 통해 이루어집니다. (요청 URL의 호스트 부분과 같은 외부 측면을 기반으로) 사용할 연결을 결정할 수 있습니다.

인터넷에서 어딘가에서 적어도 하나의 게시물을 보았습니다. 그러나이 시간에는 링크를 찾을 수 없습니다.

Castle Windsor를 사용하는 경우 NHibernate 통합 기능을 살펴보십시오. 이것은 클라이언트마다 세션 팩토리를 가질 수있게하는 다중 (명명 된) 세션 팩토리의 개념을 지원합니다. 통합 기능은 ISessionManager 인터페이스를 제공합니다.이 인터페이스를 사용하면 명명 된 세션 팩토리에서 세션을 열고 (웹 응용 프로그램의 요청 별 세션 의미를 제공 할 수 있음) 세션에 대한 액세스가 필요한 모든 것은 단순히 ISession 생성자 매개 변수를 취할 수 있으며 ISessionManager를 생성자 매개 변수로 사용하는 팩터 리를 만들 수 있습니다. 그런 다음 공장은 적절한 명명 된 세션 팩터 리에서 세션을 열 수 있습니다. 요청을 검사하여 명명 된 세션 팩토리를 사용해야하는지 판별 할 수 있습니다.

1

나는 또한 내 다음 프로젝트를 위해 그것을 파고 들었다. 사용자 지정 IConnectionProvider를 구현하고 "connection.provider"를 사용하여 구성에 등록 할 수 있습니다.

DriverConnectionProvider에서 파생시키고 ConnectionString을 오버라이드 한 다음 완전히 맞춤형으로 구현하는 것이 좋습니다. 이 도움이

public class ContextualConnectionProvider : DriverConnectionProvider 
    { 

     protected override string ConnectionString 
     { 
      get 
      { 
       return GetCurrentTenantDatabaseConnectionStringInternally(); 
      } 
     } 

     public override void Configure(IDictionary<string, string> settings) 
     { 
      ConfigureDriver(settings); 
     } 

    } 

희망 :

그것은이 같은 일이 될 수 있습니다.

1

여러 가지 방법으로이를 수행 할 수 있지만 데이터 모델보다 더 많은 문제가 발생할 수 있습니다. 나는 제품을 연결하는 것을 싫어하지만, 내가 일하는 회사 인 Apprenda에 의해 SaaSGrid를 확인하고 싶다. 우리는 당신이 하나의 세입자 SOA 애플 리케이션 (데이터 액세스를 위해 NHibernate를 자유롭게 사용하자)을 작성할 수있는 클라우드 운영 시스템이다. 귀하의 앱에 멀티 테넌시. 응용 프로그램을 게시 할 때 데이터 모델 (격리 된 데이터베이스 또는 공유)을 선택하면 SaaSGrid가 적절하게 배포되고 코드 변경없이 응용 프로그램이 실행됩니다. 마치 단일 임차인처럼 코드를 작성하십시오!

0

공유 스키마 접근 방법을 사용하려면 결과를 제한하는 추가 정보로 모든 쿼리를 가로 채고 장식해야합니다.

NHibernate에이 작업을 수행하는 인터셉터를 제공하고, 이벤트 리스너

이러한 논의에 대한 http://elegantcode.com/2008/05/15/implementing-nhibernate-interceptors/http://www.codinginstinct.com/2008/04/nhibernate-20-events-and-listeners.html를 참조 NHibernate에 2.0 Aplpha 1에서도 사용할 수 있습니다.

Ayende의 Rhino Security 구성 요소에 대해서는 보안 설명자를 기반으로하는 추가 제한 사항을 사용하여 쿼리를 수정하기 위해 많은 작업을 수행하므로 살펴보십시오. https://rhino-tools.svn.sourceforge.net/svnroot/rhino-tools/trunk/security

2

나는 멀티 테넌시 here에 대한 접근 방식을 블로그에 올렸지 만 모든 상황에 이상적이지는 않지만 접근하지 않아도 멀티 테넌시 문제를 크게 잊어 버릴 수 있습니다 타사 제품.

+0

링크가 죽어있는 것처럼 보입니다. url은 다른 곳에서 찾기 위해 많이 가지 않습니다. –

관련 문제