2010-06-01 5 views
2

ninject와 NHibernate를 사용하여 옵저버 패턴을 구현하려고합니다.Ninject/NHibernate 이벤트 + 옵저버 패턴

NHibernate를 통해 객체가 지속되거나 삭제 될 때 "트리거"역할을하는 관찰자를 삽입 할 수 있기를 바랍니다.

키 points-는

  1. 나는 관찰자 내가 NHibernate에 PostInsert/PostUpdate 이벤트를 사용하고 왜 저장 캐스케이드를 포함, 객체가 유지 될 때마다 통지를합니다.
  2. Ninject를 통해 관찰자를 삽입 할 수 있기를 원합니다 (nhibernate 이벤트 핸들러에서 커널을 원하지 않는).
  3. 관찰자는 유지되는 개체의 유형에 따라 다르므로 NHibernate 이벤트에서 어떤 관찰자를 호출해야하는지 알 수있는 좋은 방법이 필요합니다.

내 코드는 생성자 삽입을 사용하여 NHibernate를 통해로드 된 객체에 대해 훌륭하게 작동합니다. 옵저버 클래스는 nhibernate 이벤트를 통해 전달되는 도메인 모델에 주입되며 문제없이 해제 될 수 있습니다.

문제 : 우리의 기존 코드베이스는 도메인 객체에 대한 기본 생성자를 팩토리 대신 사용합니다. 이 때문에 관찰자는 공장을 사용하지 않는 한 주입되지 않습니다.

나는 모든 것을 공장으로 전환하는 것이 효과가 있다는 것을 알고 있지만 누구나이 작업을 수행하는 데 더 좋은 제안이 있는지 알고 싶었습니다. 그래서 새로운 객체 나 다른 것을 인스턴스화하는 팩토리를 만들어야합니까?

+0

그래서 ctor 인수에 나열된 종속성을 가진 도메인 개체에 ctor를 넣을 수 없습니까? – AaronHS

답변

1

NHibernate의 Event Handler 패턴 위에 Observer 패턴을 넣으려고하면 인생이 복잡 해지는 것처럼 보입니다.

NHibernate는 이미 플러그 가능한 이벤트 리스너를 갖는 방법을 제공합니다 - 단지 그것을 사용하지 않는 이유는 무엇입니까?

class FooPostInsertEventListener : IPostInsertEventListener 
{ 
    public void OnPostInsert(PostInsertEvent @event) 
    { 
     var entity = @event.Entity; 
     var entityType = entity.GetType(); 

     if (entityType != typeof(Foo)) return; 

     ProcessFoo(entity); 
    } 
} 

당신이 커널을 통과 필사적 경우 자 NHibernate를 구성 할 때, 당신은 심지어 커널을 사용할 수 있습니다. 이런 식으로 :

config.EventListeners.PostInsertEventListeners = Kernel.GetAll<IPostInsertEventListener>().ToArray();