2011-06-15 4 views
0

autofac을 사용하여 클래스의 객체를 인스턴스화 한 다음이를 저장 용 db4o에 전달하는 방법을 알 수 있습니다. db4o에서 객체 인스턴스를 검색해야 할 때, 객체를 autofac에 어떻게 등록합니까?Model 객체에 db4o와 autofac을 통합하는 방법은 무엇입니까?

원래 투명성 활성화/지속성을 구현하기 위해 db4o의 MSBuild 도구를 사용할 계획 이었지만, IActivatable::Bind()에 추가 코드를 넣을 수 있도록 모든 내 Model 개체에 대해 IActivatable 인터페이스를 수동으로 구현해야하는 것처럼 보입니다. 포인터가 활성화 될 때 this 포인터를 등록하십시오.

최악의 경우, IActivatable::Bind()의 구현은 등록을 수행하기 위해 현재의 Autofac 수명 범위의 싱글 톤에 액세스해야 함을 예상합니다. 분명히, db4o가 활성화되는 객체 인스턴스에 현재 수명 범위를 전달할 수 없습니다. 범위를 전달하는 것만 큼 나쁠만큼 대중의 싱글 톤에서 현재의 삶의 범위를 고수하는 사람들의 신음 소리를 상상할 수 있습니다.

db4o의 유형 핸들러를 구현하고 그 시점에서 객체 인스턴스화를 가로 채는 방법이 있지만 db4o를 사용하여 객체를 저장하는 데 따른 이득을 취소하는 것처럼 보입니다.

아니면 autofac을 사용하여 모든 객체를 인스턴스화하는 아이디어가 너무 미쳤나요? (예를 들어 망치가 있고 모든 것이 못처럼 보였습니다.) 모델 객체는 db4o가 사용하는 평범하고 오래된 '새로운'및 모든 마술에 의해 인스턴스화되어야합니까? 즉, View, ViewModel 및 Controller 객체에만 autofac을 사용하십시오.

답변

3

"실제 경로"는 없지만 권장되는 접근 방법은 도메인 모델에서 서비스를 직접 사용하지 않고 대신 IoC 사용 가능 처리기에 '도메인 이벤트'를 전달하는 것입니다. -

지미 Bogard이 주제에 대한 게시물의 좋은 번호를 가지고 당신이 Autofac에 대한 적응 할 수 있어야한다고 StructureMap에 대한 예제가있다 : http://lostechies.com/jimmybogard/2010/08/04/container-friendly-domain-events/

(BTW, 우연히, 내가 Autofac 기반 구현 예를 그 앞으로 몇 주 안에 출시 될 예정입니다.)

+0

도메인 이벤트를 사용하는 것은 유망한 방법 인 것처럼 보이지만 여전히 이벤트를 발생시키기 위해 데이터베이스에서 모든 개체로드를 전달할 수 있어야합니다. 투명한 활성화를 위해 너무 많은 경우 인스턴스를 autofac으로 등록하기 만하면 활성화를 "처리"해야 할 경우 더 이상 투명하지 않습니다. – Ants

+0

db4o의 이벤트를 사용하는 것에 대한 @ Gamlor의 대답은 도메인 이벤트를 사용하는 아이디어와 잘 맞습니다.각 활성화를 "처리"해야하지만 적어도 각 도메인 객체의 코드는 건드릴 필요가 없습니다. 이 Central Activated 이벤트 핸들러를 호출하면됩니다. 필자는 autofac IContainer를 통과하지 못하게하는 방법을 아직 보지 못했습니다. DomainEvent.Container 또는 람다 (lambda)로 작성된 Activated 이벤트 핸들러 코드에 있어야합니다. – Ants

1

'new'를 모두 Autofac 인스턴스로 바꾸는 것이 좋습니다. 내 경험에 따르면, 개체가 복잡한 종속성 (간단한 컬렉션, 핵심 CLR 유형, 기타 단순 개체가 아닌)을 필요로 할 때 Autofac이 작업을 수행하게하는 것입니다. 간단한 도메인 객체 나는 보통 새로운 연산자를 사용하거나 팩토리를 생성한다.

귀하의 질문에 대한 답을 얻을 수 있을지 100 % 확신 할 수 없습니다. 일부 서비스를 인스턴스화 할 때 도메인 모델에 바인딩하고 싶습니까? 그렇다면 events을 사용하는 것이 좋습니다. db4o 이벤트를 사용하여 객체 저장, 활성화 등을 감지 할 수 있습니다. 이러한 이벤트 리스너에서는 현재 Autofac 범위를 사용하여 추가 서비스를 전달할 수 있습니다.

btw. IActivatable :: Bind() 물건은 이미 db4o에 의해 호출됩니다. 당신은 다른 것을 할 필요가 없습니다.

일반적으로 나는 모든 것을 정확하게 스코어링하고 Autofac을 서비스 위치 지정자로 남용하지 않도록 노력할 것입니다.

+0

나를 이벤트로 안내해 주셔서 감사합니다. 저의 질문에서 지적한 바와 같이 문제가되는 것은 커밋 부분이 아닙니다. 문제가되는 부분입니다. 아무 것도하지 않고 그냥 TA를 사용하면 autofac에 등록되지 않은 객체가 메모리에로드됩니다. 로드 할 때 dbct가 IActivatable :: Bind()를 호출 했으므로 autofac으로 객체를 등록 할 기회로 사용하고 있습니다. 필자도 지적했듯이 서비스 위치 지정자로 autofac을 사용하지 않으려했습니다. – Ants

+0

이벤트 레지스트리 API를 보면 Activated 이벤트가 있음을 알 수 있습니다. 더 나은 점은 Nick이 제안한 도메인 이벤트 개념과 잘 맞습니다. 내 Activated 핸들러에서 autofac IContainer를 사용할 수 있어야합니다. 위로 측면에서, 이것은 각 도메인 객체에 대한 코드를 만지기보다는 덜 부담스러워 보입니다. – Ants

관련 문제