2009-12-16 2 views
1

내 응용 프로그램 중 하나는 공용 웹 사이트이고 다른 하나는 인트라넷입니다. 공용 웹 사이트는보기를 통해 특정 테이블에 액세스해야하는 제한된 보안 사용자를 사용하여 실행되지만 인트라넷은 테이블 자체에 액세스 할 수 있습니다.NHibernate : 컨텍스트에 따라 약간 다른 hbm 매핑 파일 사용

이것은 Fluent NHibernate를 사용하여 설치하는 것이 아주 간단 할 것 같습니다.

public class MyEntityClassMap : ClassMap<MyEntity> 
{ 
    public MyEntityClassMap() 
    { 
     if (NHibernateConfig.Current.Context == "intranet") 
      Table("t_MyEntity"); 
     else 
      Table("v_MyEntity_pub"); 
     ... etc 
    } 
} 

포함 된 HBM 파일을 이렇게 간단한 방법이 있나요 : 내 ClassMap에서이 같은 확인을 할 수 있습니까? 내가 생각할 수있는 유일한 방법은 hbm 파일의 두 복사본을 갖는 것인데, 이는 혼란스럽고 이상적인 것으로부터 멀어 질 것입니다.

동일한 결과를 얻는 더 좋은 방법이 있습니까?

답변

3

실제로 무엇을 요구할 수 있습니다. SessionFactory가 빌드되기 전에 (응용 프로그램 시작시) 실제로 포함 된 XML 파일에 액세스하고 내용을 변경할 수 있습니다.

"v_MyEntity_pub"테이블을 대신 참조하려는 경우이 참조를 동적으로 변경할 수있는 방법은 기본적으로 엔티티에서 "t_MyEntity"를 참조하도록 선택할 것입니다. 코드는 그대로 작동하지만) 아이디어를 얻을 것이다 :

NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration(); 
    cfg.AddAssembly(ASSEMBLYNAME); 

    if (NHibernateConfig.Current.Context != "intranet") //this is how you have stated you distinguish the intranet application from the other one. 
    { 
     string[] resourcesNames = assembly.GetManifestResourceNames(); 
     foreach (string resourceName in resourcesNames) 
     { 
      StreamReader sr = new StreamReader(assembly.GetManifestResourceStream(resourceName)); 
      string resourceContent = sr.ReadToEnd(); 
      resourceContent = resourceContent.Replace("t_MyEntity", "v_MyEntity_pub"); 
      cfg.AddXmlString(resourceContent); 
     } 
    } 

    ISessionFactory sessionFactory = cfg.BuildSessionFactory(); 

위의 코드는 응용 프로그램의 수명 동안 만 인트라넷 응용 프로그램에 대해 한 번만 실행해야합니다.

+1

아 멋지다,이게 stackoverflow를 정말 대단한 것입니다! – cbp

0

이것은 아마도 사용자의 문제에 대한 가장 유용한 대답은 아니지만 매핑 파일에서 이것이 가능하다고 생각하지 않습니다. 또한 두 개의 hbm 파일이 동일한 이름으로 작동하지 않는다고 생각합니다. 두 파일을 구별 할 수 없으므로 각각 다른 이름과 맵핑 파일을 가진 두 개의 동일한 개체가 있어야합니다. 당신의 질문에서 말했듯이, 완전히 혼란 스러우며 이상은 단순히 당신이 언젠가 도달하고자하는 지평선의 지점이 될 것입니다.

보기를 통해 모든 것을 직접 액세스 할 수없는 이유는 무엇입니까? 이 과정에 관련된 글이 없다고 가정하고 있습니까? 보안을 유지하면서 데이터에 액세스하는이 방법을 변경할 수있는 방법이 있습니까?

+0

귀하의 우려에 대답하려면 : 1) 나는 두 개의 hbm 파일을 별도의 어셈블리에 넣은 다음 NHibernate를 구성하는 데 사용할 어셈블리를 전환 할 수 있습니다. 2)보기는 민감한 데이터에 대한 액세스를 제한하는 데 사용됩니다 (예 : 1 일보다 오래된 데이터에 대한 액세스를 제한). 이러한 보안을 구현하는 일반적인 방법입니다. 3)보기에서 삽입 및 업데이트를 실행할 수 있습니다 - SQL은 테이블로 이동해야합니다. 4) 나는이 보안 기능을 구현하는 더 좋은 방법을 생각할 수 없다. – cbp

+0

@cbp 1) 두 가지 다른 액세스 유형 (인터넷/인트라넷) 때문에 액세스 할 수있는 방법에 따라 보안이 달라질 수 있다고 생각했는데 두 가지 어셈블리가 아닙니다.) 이런 종류의 보안은 절대적으로 데이터베이스 수준 일 필요는 없으며 응용 프로그램 수준 일 수 있습니다. 3) 나는 당신이 뷰에 쓸 수 없다고 믿었 기 때문에 글쓰기를 요구하지 않았습니다. 단순한 데이터 기반의 규칙 만 있으면 컬렉션 접근에서 'where'속성으로 매핑 파일에서 쉽게 필터링 할 수 있기 때문입니다 – Jay

+0

4) 응용 프로그램이었고 DBA의 엄격한 지침에 따르지 않은 경우 개인적으로 ORM 자체에 보안을 적용 할 것입니다. 자세한 설명을 원하면 여러 가지 방법이 있습니다. . 즉, NHibernate를 사용할 때 가능한 한 뷰/SP 생성을 피하고 응용 프로그램 내부에 내 비즈니스 로직을 유지하려고한다. 일부 직업에서는 DBA와 개발자간에 업무가 분리되는 것처럼 보이지만 데이터베이스를 제어하는 ​​개발자의 경우에는 이것이 문제가되지 않는다고 생각합니다.그게 개인적인 취향이지만 :) 개인적으로는 개인적인 취향입니다. – Jay

관련 문제