2013-05-21 60 views
1

我有2個完全獨立的項目之一,VB和一個在C#正與2獨立的項目,C#和VB

項目A - VB

項目B - C#

我們有通過項目A中的代碼當前使用項目B中的代碼的情況例如

項目A

Public Class SMS 
    Public Sub New() 

    End Sub 

    Public Function SendSMS() As String 
     Return "SMS Sent " 
    End Function 
End Class 

項目B

using ProjectA; 
    public class Email 
    {  
     public string SendEmail() 
     { 
     return "Email Sent "; 
     } 

     public string SendEmail(SMS sms) 
     { 
      sms.SendSMS(); 
      return "Email Sent "; 
     } 
    } 

這工作得很好但是,我們現在有一個要求,從項目A發送電子郵件這將創建一個循環引用閱讀幫助負載在這裏我創建後一個接口並使用項目a中的接口,因此:

項目C

Public Class Interface 
    Public Interface IEmail 
     Sub SendEmail() 
    End Interface 
End Class 

我已經實現對郵件的界面,改變項目A到:

Public Function SendSMS(ByVal tEmail As IEmail) As String 
    tEmail.SendEmail() 
    Return "SMS Sent " 
End Function 

,我可以實例化對象和一切工作正常其中一期工程從我的UI罰款。 但是我遇到了一個問題,即由我不想實例化的用戶界面,而是在項目A

Public Sub SendSMSAndEMail() 
    Dim temail As New email 
    Me.SendSMS(temail) 
End Sub 

我都創下了實際道路塊bject?我想我應該看看一個工廠班,但我對如何最好地實現這一點感到困惑?

N.B進一步信息:

如果我們設計系統再次項目A和項目B將在同一項目(和語言),這會不會造成問題。因爲它是我們有2 UI的一個控制檯服務器應用程序和一個Win窗體UI。項目B最初用於控制檯應用程序,並使用主Win表單應用程序使用的各種功能。現在出現了我們在主應用程序中需要控制檯應用程序中的代碼,例如發送電子郵件的功能,但是代碼難以從控制檯應用程序中提取,因爲它與主要應用程序的語言不同應用。

+0

爲什麼要首先在項目A中實例化對象? – Fendy

+0

我們需要發送的SMS消息的電子郵件混淆。 SMS消息的當前發送過程在項目A中處理(爲簡單起見未顯示?您是否可以建議另一種方法? –

回答

0

危機的解決方案:靜態工廠功能

申報根本項目靜態類(例如,在接口的項目)。

public static class EmailFactory{ 
    public static Func<IEmail> Create{ get;set; } 
} 
在UI

然後(我假設你的項目將結束在UI開始),設置它喜歡:

EmailFactory.Create = new Func<IEmail>(() => { return new ProjectB.Email() }); 

這樣你就可以從A計劃(即使你仍然靜態地使用它需要從UI執行它)。

但忘了它,你不會需要它。或者至少,不要使用它。

如果說

SMS消息的當前發送處理項目A.辦結

這是否意味着項目A可以直接執行?我希望不是。正在執行的圖書館對我來說是一種邪惡。如果可以,請在單獨的項目中執行,並且該項目也可以參考項目A和B.如果是這樣,那麼你的interface approach已經滿足要求。

編輯:

貌似項目A或B本身是在UI水平。在UI項目中使用庫代碼是一個糟糕的設計。然而,重構整個應用程序需要幾個月的時間。

我可以建議的是創建一個圖層庫,它需要在項目之間交互使用。所以架構應爲:

 infrastructure 
      | 
      | 
     library 
     / \ 
    /  \ 
[Project A] [Project B] 

恕我直言,這是解決您的問題的唯一方法。

+0

UI不知道SMS或EMail是否在後臺調用時發送,並在某些情況下事件發生,因此我不能在UI級別引用對象,我不得不在項目A或B中這樣做。 –

+0

看起來像Project A正在直接執行,我認爲這不是一個好方法。任何問題來創建另一個項目(控制檯應用程序)直接從項目A執行任務? – Fendy

+0

如果我們再次設計系統項目A和項目B將在同一個項目中,這不會導致問題。我們有2個用戶界面的控制檯服務器應用程序和一個贏取窗體用戶界面,項目B最初是用於控制檯應用程序,並使用主要的Win表單應用程序使用的各種功能,現在出現了控制檯應用程序,我們需要從主應用程序內部發送電子郵件等功能,但代碼難以從控制檯應用程序中提取,因爲它與主應用程序的語言不同。 –