2013-02-03 185 views
2

Autofac是否支持易於使用的消息代理來執行多對多的發佈/訂閱事件消息傳遞?Autofac:發佈/訂閱擴展

編輯:

public class Service1 
{ 
    [Publish("message://an-event")] 
    public event Event<EventParams> AnEvent; 

    public void DoSomething() 
    { 
     // do something 
     // [...] 

     // publish message 
     if (AnEvent != null) 
      AnEvent(this, new EventParams(something)) 
    } 
} 

public class Service2 
{ 
    [Subscribe("message://an-event")] 
    public OnAnEvent(object sender, EventParams eventParams) 
    { 
     Console.WriteLine("Hello World from Service2") 
    } 
} 

public class Service3 
{ 
    [Subscribe("message://an-event")] 
    public OnAnEvent(object sender, EventParams eventParams) 
    { 
     Console.WriteLine("Hello World from Service3") 
    } 
} 

約Ninjects消息broaker擴展很酷的事情是它的簡單性。您只需將註釋添加到發佈訂閱此事件的事件和方法的事件。容器自動處理連接。你只需要綁定服務。

有autofac類似的東西嗎?如果不是,用autofac做這種事情的最好方法是什麼?

+1

你是什麼意思的'支持'(是'我該怎麼做'或'是否有一個現成的擴展')? 「易於使用」是什麼意思? –

+0

易於使用我的意思是主要是一個隨時可用的擴展,如ninject提供的擴展 – user1022465

+0

請將鏈接發佈到顯示您需要的頁面或粘貼代碼段。對於不瞭解Ninject的人來說,猜測你想要什麼是相當困難的。 –

回答

3

Autofac目前不提供任何特定的消息代理支持。 Autofac是一個IoC容器,不是消息代理,如果要添加任何內容,它將是Ninject's bbeventbroker工作方式支持外部系統的擴展 - 可能會幫助您連接事件處理,但不能管理實際代理。 (就像Autofac沒有做自己的MVC或WCF實現 - 只需助手與現有系統的接口)

你可以滾動使用類似bbvcommon Event BrokerNServiceBus使用像Autofac's lifetime events和/或custom registration sources系統自己的集成但究竟需要如何完成,看起來將取決於您正在整合的系統。您可以查看其他集成組件的來源以獲取想法和模式。

如果你確實得到了一些有用的東西,你可以考慮將它作爲一個Autofac.Extras項目加入。

+0

使用NServiceBus在我看來,就像「使用大錘擊碎堅果」一樣符合我的目的,但bbvcommon EventBroker看起來很小且易於使用。 – user1022465

+0

我並沒有提出使用特定經紀人的建議,只是以這些爲例。我確信還有其他人。這將取決於你評估你的選擇,並確定什麼是最適合你的。 –

2

猜測你想要類似https://github.com/ninject/ninject.extensions.weakeventmessagebroker的東西,答案肯定是'是'。實際上,我不明白爲什麼消息代理實現與IoC容器綁定。它們是完全獨立的組件,完全獨立的任務。您可以選擇任何消息代理實施並將其註冊到任何IoC容器。

你甚至可以挑ninject.extensions.weakeventmessagebroker與Autofac這樣註冊它:

builder.RegisterType<EventReflectionStrategy>().As<IPlanningStrategy>(); 
builder.RegisterType<EventBindingStrategy>().As<IActivationStrategy>(); 
builder.RegisterType<WeakEventMessageBroker>().As<IWeakEventMessageBroker>() 
     .SingleInstance(); 

,然後作爲一個依賴添加IWeakEventMessageBroker的類型來使用它。雖然我沒有嘗試過。

也許它沒有那麼多準備好使用,但它仍然很容易。

更新

我編輯的代碼示例打開經紀人成單,因爲它要達到預期效果,應是必需的。

0

消息代理體系結構本身並不綁定到您正在使用的容器上。有關.NET消息代理的一些示例,包括基於Rx的示例,請參閱this article