2013-01-16 1 views
0

Ninject Event Broker 확장 프로그램을 사용하고 있으며 두 가지 서비스가 있습니다. ServiceOne은 이벤트 게시자입니다. ServiceTwo은 구독자입니다. ServiceOneServiceTwo에 대해 크게 의존하지 않으므로 DependencyCreation 확장을 사용하여 종속성을 만듭니다.Ninject DependencyCreation 및 EventBroker 확장. 일대일 구독 보장

  • 나는이 두 개체 사이의 일대일 이벤트를 정의하려면 :

    다음은 요구 사항입니다. DependencyCreation에 의해 생성 된 ServiceTwo 인스턴스 만 이벤트를 받아야합니다.

  • 그래프의 다른 객체가 더 아래에있는 경우 이벤트를 수신해서는 안됩니다. (이 경우가 아니어야합니다. )
  • ServiceTwoServiceOne이 처리 될 때 처리해야합니다.
  • 이것은 웹 응용 프로그램이며 ServiceOne의 수명은 한 번만 이어야합니다.

은 기본적으로 그냥 쓰는 날의 동작을 재현하기 위해 노력하고있어 :

var publisher = new Publisher(); 
var subscriber = new Subscriber(); 
var subscriber2 = new Subscriber(); 
publisher.MyEvent += subscriber.MyEventHandler; 

한 게시자. 가입자 한 명. Subscriber2는 이벤트를받지 않습니다.

this.Bind<IServiceOne, ServiceOne>().To<ServiceOne>().Named("ServiceOne").OwnsEventBroker("ServiceOne").RegisterOnEventBroker("ServiceOne"); 
this.Kernel.DefineDependency<IServiceOne, IServiceTwo>(); 
this.Bind<IServiceTwo>().To<ServiceTwo>().WhenParentNamed("ServiceOne").InDependencyCreatorScope().RegisterOnEventBroker("ServiceOne"); 

두 질문 :

여기 내 코드입니다.

내 요구 사항을 충족합니까? 더 좋은 방법이 있습니까?

답변

0

나는 보통 내 자신의 질문에 대답하고 싶지 않지만 잠시 동안 조용하게 보았으므로 필자의 코드 샘플을 테스트 해 보았지만 제대로 작동하는 것으로 보입니다. 이러한 종속성 생성 및 전체 이벤트 브로커 등록 프로세스를 정리하기 위해 몇 가지 확장 메소드를 작성했습니다. 먼저 범위의 이벤트 브로커를 생성하는 IsPublisher 확장 오프 : 두 번째

public static ISubscriberBuildingSyntax IsPublisher<TPublisher>(this IBindingWhenInNamedWithOrOnSyntax<TPublisher> syntax) 
    { 
     string name = Guid.NewGuid().ToString(); 
     syntax.Named(name); 
     syntax.OwnsEventBroker(name).RegisterOnEventBroker(name); 
     return new SubscriberBuildingSyntax<TPublisher>(syntax, name); 
    } 

, 종속성 Creator를 사용하여 종속성을 생성하는 일반적인 CreateSubscriberDependency 방법 :

public ISubscriberBuildingSyntax CreateSubscriberDependency<TSubscriber>() where TSubscriber : class 
    { 
     this.syntax.Kernel.DefineDependency<TPublisher, TSubscriber>(); 
     this.syntax.Kernel.Bind<TSubscriber>().ToSelf().WhenParentNamed(this.name).InDependencyCreatorScope().RegisterOnEventBroker(this.name); 
     return this; 
    } 

나는 다음과 같이이를 호출 할 수

 this.Bind<IRegistrationService>().To<RegistrationService>() 
      .IsPublisher() 
      .CreateSubscriberDependency<RoleService>(); 

이 는 이벤트 브로커가 RoleService DEPENDE으로 RegistrationService 인스턴스 범위 생성 그 삶은 RegistrationService의 삶에 묶여 있습니다.

그러면 RegistrationServiceInRequestScope으로 등록하여 한 요청의 수명을 제한 할 수 있습니다.