2014-03-25 24 views
1

我有一個Windows窗體應用程序包含3個項目中的1個解決方案。來自調用者類的調用方法,避免循環依賴

Hall.Client < - 的Winforms

Hall.Admin < - 的Winforms

Hall.Processor < - 類庫

Hall.ClientHall.Admin需要Hall.Processor作爲參考。由於循環依賴性,Hall.Processor無法添加對Hall.ClientHall.Admin的引用。 所有我需要的是讓每個呼叫者類的實例在Hall.Processor

Hall.Client我有一個叫天幕

public class Canopy : System.Windows.Form 
{ 
    public void SetProcessName(string name) 
    { 
     this.txtProcessName.Text = name; 
    } 
} 

Hall.Admin我有一個名爲屋頂

public class Roof : System.Windows.Form 
{ 
    public void SetProcessName(string name) 
    { 
     this.txtProcessName.Text = name; 
    } 
} 

我有課Builder類中的Hall.Processor中的方法

public class Builder 
{ 
    Form form; 
    public Builder(Form form) 
    { 
     //Here the main problem. 
     //if the caller class is Hall.Admin.Roof then this.form should be Hall.Admin.Roof 
     //if the caller class is Hall.Client.Canopy then this.form should be Hall.Client.Canopy 
    } 
    public void SetProcessName() 
    { 
     //How to call method in caller class directly from this class 
     //if(Admin.Roof) then form.SetProcessName("something about admin"); 
     //if(Client.Canopy) then form.SetProcessName("something about client"); 
    } 
} 

我需要建議如何解決我的問題。有沒有與我的問題有關的設計模式?

回答

2

通過使用接口將類彼此解耦。您可以在Processor庫內聲明所有接口,或者更好地在單獨庫中聲明所有接口,在Client,AdminProcessor項目之間共享。然後你可以做像form is IRoofform is ICanopy這樣的支票。

但請注意,在這種情況下,沒有任何東西可以阻止Admin實施ICanopyClient從做IRoof。如果這確實是一個問題,請使接口internal,並通過[assembly: InternalsVisibleTo("Assembly")](見"Friend Assemblies")控制他們對其他組件的可見性。

此外,在網上搜索「依賴注入」

+0

我仍然困惑你的解釋。網絡上有很多例子,它們都不符合我的需求。 – derodevil

+0

@dededevil,什麼是完全混淆?你是否熟悉[C#中的接口](http://stackoverflow.com/a/22549046/1768303)? – Noseratio

+0

是的,我。我在想的是工廠模式,而不是DI。這就是我很困惑。 – derodevil