2012-09-20 62 views
0

在我正在處理的應用程序中,我們有一些操作會在將新實體添加到存儲庫時觸發。其中一項新操作應該使用服務(如服務層,而不是以太網某處的Web服務)來執行某些商業規則操作。根據業務規則選擇服務實現

這是一切都很好,但是應該使用確切的服務會根據我們操縱的實體的屬性(基本上,根據實體與哪個客戶有關)而變化。我希望保持鬆散的行動,以適應可能需要調用的服務。

我想要做的是實現一個工廠,它將接受實體並返回正確的服務。不過,這看起來有點不方便。有沒有更好的方法來設置它?

我曾經考慮過在運行時使用IoC容器來確定正確的實現,但仔細閱讀一對(Ninject和Windsor)似乎並不表示它們非常適合這種操作。

+1

'工廠'方法幾乎是這樣的事情的正確設計。你爲什麼這是「有點傻」? – Oded

+0

我不確定。我想我只是不喜歡在某處放出服務的巨大轉換語句的想法。似乎應該有一個更優雅的方式。所以,我想我會檢查是否有其他人知道。 :) – Michael

+1

那麼,如果這是所有的類/方法正在做,顯然這是它的工作......比試圖對它「聰明」更好。 – Oded

回答

0

我認爲這個迭代,我們會保持簡單,並使用工廠來選擇適當的界面(即我認爲原始帖子中的「kludgy」)解決方案。感謝所有的反饋!

0

你接近這個錯誤的方式。你應該用事件這樣的:

// your repository event 
public class ItemCreated<T> 
{ 
} 

的處理程序:

public class DoSomething : ISubscribeOn<ItemCreated<User>> 
{ 
    public class DoSomething(ISomeService) 
    {} 
} 

注意,它不是服務本身,而是一箇中間人,關於事件的訂閱。它使事情更少解耦。

所有這一切都被內置到我的IoC容器:http://www.codeproject.com/Articles/440665/Having-fun-with-Griffin-Container

向下滾動到域中的事件。

+1

這與應用程序今天的工作方式幾乎完全相同,並且可以與更改一起工作。主要問題是如何根據'User'的屬性選擇'ISomeService'的實現。 – Michael

+0

使用工廠和服務地點 – jgauffin