NHibernate 기반 도메인 모델에서 멀티 테넌트 기능의 투명하고 유창한 지원을 구현하는 가장 좋은 전략은 무엇입니까? 멀티 임차인 아키텍처와 NHibernate
임 방법을 찾고, TenantID에 의해 필터링과 같은 멀티 테넌트 (multi-tenant) 물건에서 가능한 한 고립으로 도메인 로직을 유지하는 방법 등답변
Ayende는 멀티 테넌시 (Multi-tenancy) 애플리케이션 구축에 대한 좋은 블로그 게시물이 있습니다. NHibernate가이를 위해 어떻게 사용되는지는 멀티 테넌시 유형에 따라 다릅니다.
가장 간단한 방법은 각 클라이언트마다 다른 데이터베이스를 사용하는 것입니다.
이러한 방식으로 멀티 테넌트를 구현하면 단일 테넌트 애플리케이션을 효율적으로 작성하고 세션을 생성/검색하는 시점에서 멀티 테넌트에 대해서만 걱정할 수 있습니다.
아직 세부 사항을 깊이 파고 들지는 않았지만 (몇 달 후에 비슷한 작업이 필요합니다) 세션이 연결된 데이터베이스를 관리하는 가장 쉬운 방법은 사용자 지정 ISessionFactory 구현을 통해 이루어집니다. (요청 URL의 호스트 부분과 같은 외부 측면을 기반으로) 사용할 연결을 결정할 수 있습니다.
인터넷에서 어딘가에서 적어도 하나의 게시물을 보았습니다. 그러나이 시간에는 링크를 찾을 수 없습니다.
Castle Windsor를 사용하는 경우 NHibernate 통합 기능을 살펴보십시오. 이것은 클라이언트마다 세션 팩토리를 가질 수있게하는 다중 (명명 된) 세션 팩토리의 개념을 지원합니다. 통합 기능은 ISessionManager 인터페이스를 제공합니다.이 인터페이스를 사용하면 명명 된 세션 팩토리에서 세션을 열고 (웹 응용 프로그램의 요청 별 세션 의미를 제공 할 수 있음) 세션에 대한 액세스가 필요한 모든 것은 단순히 ISession 생성자 매개 변수를 취할 수 있으며 ISessionManager를 생성자 매개 변수로 사용하는 팩터 리를 만들 수 있습니다. 그런 다음 공장은 적절한 명명 된 세션 팩터 리에서 세션을 열 수 있습니다. 요청을 검사하여 명명 된 세션 팩토리를 사용해야하는지 판별 할 수 있습니다.
나는 또한 내 다음 프로젝트를 위해 그것을 파고 들었다. 사용자 지정 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);
}
}
희망 :
그것은이 같은 일이 될 수 있습니다.
여러 가지 방법으로이를 수행 할 수 있지만 데이터 모델보다 더 많은 문제가 발생할 수 있습니다. 나는 제품을 연결하는 것을 싫어하지만, 내가 일하는 회사 인 Apprenda에 의해 SaaSGrid를 확인하고 싶다. 우리는 당신이 하나의 세입자 SOA 애플 리케이션 (데이터 액세스를 위해 NHibernate를 자유롭게 사용하자)을 작성할 수있는 클라우드 운영 시스템이다. 귀하의 앱에 멀티 테넌시. 응용 프로그램을 게시 할 때 데이터 모델 (격리 된 데이터베이스 또는 공유)을 선택하면 SaaSGrid가 적절하게 배포되고 코드 변경없이 응용 프로그램이 실행됩니다. 마치 단일 임차인처럼 코드를 작성하십시오!
공유 스키마 접근 방법을 사용하려면 결과를 제한하는 추가 정보로 모든 쿼리를 가로 채고 장식해야합니다.
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
나는 멀티 테넌시 here에 대한 접근 방식을 블로그에 올렸지 만 모든 상황에 이상적이지는 않지만 접근하지 않아도 멀티 테넌시 문제를 크게 잊어 버릴 수 있습니다 타사 제품.
링크가 죽어있는 것처럼 보입니다. url은 다른 곳에서 찾기 위해 많이 가지 않습니다. –
음, 간단한 공유 데이터베이스/스키마 접근법에 대해 이야기하고 있습니다. 대부분의 테이블에는 특별한 임차인 식별 열이 있습니다. 하지만 도메인 모델 레벨에서 나는이 속성들 중 어떤 것도보고 싶지 않을 것입니다. – noetic
흠 ....이 경우 확실하지는 않지만 NHibernate 세션을 통해 필터를 설정할 수 있다는 것을 알지만 확실하지 않습니다 정확히 어떻게 작동하는지. 필자는 쿼리를 실행하고 쿼리에 필터를 넣지 않고 엔터티를로드 할 수 있다고 생각합니다. 이것은 당신이 원하는 것일 수 있습니다. – Gilligan