2013-01-16 51 views
0

我正在使用Ninject Event Broker擴展,並且我有兩項服務。 ServiceOne是活動的發佈者。 ServiceTwo是用戶。 ServiceOneServiceTwo沒有很強的依賴性,我使用DependencyCreation擴展創建依賴關係。Ninject依賴關係創建和EventBroker擴展。確保一對一訂購

這裏是要求:

  • 我要定義這兩個對象之間的一到一個事件。只有由DependencyCreation創建的ServiceTwo實例才能接收該事件。
  • 如果在對象 圖表中還存在其他ServiceTwo實例,則它們不應該接收該事件。 (這不應該是 ,但我想解釋它)
  • ServiceTwo應在處置ServiceOne時處置。
  • 這是一個Web應用程序,對於一個請求,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); 
    } 

其次,創建使用依賴造物主的依賴通用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>(); 

這將創建一個Event Broker,其範圍爲RegistrationService實例,其中包含RoleServicededede這與RegistrationService的生活息息相關。

然後,我可以將RegistrationServiceInRequestScope進行註冊,以將此限制在一個請求的生命週期內。

相關問題