2013-04-12 38 views
0

我正在嘗試創建一個具有特定要求的模塊(將在簡單的ASP網站中引用,使用Autofac Web表單集成)。 它應該返回一個使用特定規則集創建的字符串。這些規則由一個策略定義,對於每個「Actor」都是不同的。 「Actor」將根據來自請求的值在運行時選擇。爲了使事情變得更加困難,一些「演員」可以基於例如請求國的不同而具體實施該策略。使用autofac解決動態對象創建(在另一個動態創建的對象內)

我已經使用抽象和具體工廠(第一個瞭解哪個「Actor」具體工廠使用,第二個來確定我是否需要特定或通用actor的策略)已經解決了這個問題。問題是,在採用了強大的模塊化設計之後,我需要使用反射來獲得對特定參與者策略類的間接引用(否則我應該引用所有包含所有特定策略實現的dll)。

我很想避免這種做法,主要是因爲我想用一種獨特的方式來動態加載所需的組件。

我已經看過一些Autofac的可能性,並且從我的理解中,我可以註冊相同接口的不同實現,並使用這裏解釋的鍵(https://code.google.com/p/autofac/wiki/TypedNamedAndKeyedServices)解決它們。問題是我不知道如何在我的抽象和具體工廠內解決它們(我沒有在那裏提及解析器......我認爲我應該避免它)。

所以我的問題是:

1)我怎麼能在那種情況下使用Autofac?最好的做法是什麼(當然我錯過了很大的東西)

2)我是否必須重新考慮這個模塊的所有設計?我的意思是,我是否還需要使用抽象的和具體的工廠?

3)任何人都可以指向我的一些例子或教程也許與我的問題有關嗎?

非常感謝您的幫助,對於這個漫長而又不太明確的問題感到抱歉。

回答

1

一種可能的方法是將你的策略分爲通用策略和特定行爲策略。你已經這麼做了,但我不知道你的代碼是否反映了這一點。

  • 有兩個接口IActorSpecificStrategyIGenericStrategy
  • 向兩個接口(或從接口都派生而來)添加一個方法bool CanHandleActor(IActor actor)
  • 向工廠注入兩個枚舉:一個包含IActorSpecificStrategy,另一個包含IGenericStrategy
  • 當請求參與者的策略時,首先枚舉所有IActorSpecificStrategy實例並返回第一個,其中CanHandleActor返回true。否則,返回第一個IGenericStrategy,其中CanHandleActor返回true

如果這不適用於您的問題,請詳細解釋如何選擇策略。

+0

首先,感謝您的驚人快速反應!我完全同意你的前兩點,我會盡快實施它們。我對後面兩點有個疑問:我應該在哪裏進行注射(我的意思是,誰應該負責這樣做,我認爲應該在啓動期間在配置構建中完成,對吧?)。最後,這種方法意味着我將爲每個請求創建一個所有這些策略的實例(並且只使用一個?)我認爲autofac應該爲我處理這些細節,所以我不應該打擾,對吧? – Gnegno

+0

@Gnegno:關於您在第一個版本中提到的業務點:這兩個界面很可能是[標記界面](http://en.wikipedia.org/wiki/Marker_interface_pattern),完全沒有任何方法或屬性。注射由Autofac完成,通常在你的組合根部,所以你不需要打擾。只要給戰略工廠(實際上,它現在是一個戰略*選擇器*)與這兩個枚舉的構造函數。通常,策略本身並不保存任何狀態,所以它們將被註冊爲單例(Autofac中的'.SingleInstance()')。 –

+0

是的,對於第一個評論版本抱歉...我最初誤解了接口的目的。我認爲你的解決方案將完全符合我的需求。只要我有功能原型,我會盡快通知你。提前許多坦克! – Gnegno