Activator.CreateInstance()에 대한 호출을 NHibernate 2.0.1GA에서 사용하여 엔티티를 구성하는 방법으로 바꿀 수 있습니까? 이상적으로 그것을 StructureMap.ObjectFactory.GetInstance()로 바꾸고 싶습니다.NHibernate에서 Activator.CreateInstance()에 대한 호출을 대체 할 수 있습니까?
답변
생성자 삽입시 쉽게 수행 할 수 없습니다. Hibernate 내부는 Lazy 로딩 코드 등을 사용하여 도메인 클래스로부터 상속받은 프록시 객체를 생성해야 할 수도 있습니다. 그래서 아는 한 객체의 생성을 무시하는 간단한 옵션이 없습니다.
당신은 속성 세터 주입을 통해 객체를 빌드 할 인터셉터를 작성함으로써 NHibernate와 함께 작동하는 의존성 주입을 쉽게 얻을 수 있습니다. 이 here의 예가 있습니다. 이 예제는 Windsor를 DI 컨테이너로 사용하지만, Structure Map (물론 here are the relevant docs for StructureMap)으로 똑같은 작업을 수행 할 수 있습니다 - "Setter Injection을 기존 오브젝트 (빌드 업)에 적용"섹션을 찾으십시오.
경고 : 도메인 모델에 종속성을 주입하는 것이 디자인 문제의 증상으로 간주되는 경우가 많으므로 많은 사람들이이를 피하기 때문에 코드 작성을 시작하기 전에 실제로하고 싶은 작업인지 확인하십시오!
IInterceptor를 구현하고 Objectfactory.BuildUp을 사용하여 onload 메서드에서 주입을 수행하면 설정을 수행 할 수 있습니다. 이것은 구현하기 쉽고, 세터 주입은 원하는 것이 아닐 수도 있습니다.
사용자 고유의 IBytecodeProvider 및 ReflectionOptimizer를 구현하여 생성자 삽입을 수행 할 수 있습니다. 이것은 조금 더 어렵지만 가능합니다!
엔티티에 물건을 주입하지 않는 것이 좋습니다. 99.9 %의 케이스에서 이것은 나쁜 디자인으로 이어지고 당신의 디자인에 레이어링을 불가능하게 만듭니다. 어쩌면 당신은 옳은 일인 경우의 0.01 %에 직면 할 수 있습니다. 그것은 goto 문을 타이핑 할 때 자주하는 일입니다.
this post from Fabio Maulo (현재 NHibernate 리드 개발자)을 살펴보면 몇 달 전에이 문제를 해결했습니다. 이 코드는 NHibernate 2.1에 대한 것이지만 IProxyFactoryFactory 파트를 제거하여 2.0.1GA로 백 포트 할 수 있다고 생각합니다.
생성자 삽입 가능 – Paco
불가능하다고 말하지 않았습니다. 쉽지 않다고 말했습니다. 내가 틀렸다면, 나에게 계발 해주세요 :) –
그럼 잘 읽지 않아요. 죄송합니다. – Paco