2011-11-04 62 views
3

我在我的應用程序中使用存儲庫模式與服務層。爲了遵循最佳做法,我爲每個回購協議創建了一項服務。System.StackOverflow異常類之間的遞歸依賴關係

我的兩項服務是相互依賴的。我需要從每個服務中調用至少一種方法。

我使用依賴注入來解決這些依賴關係。看來這個問題從以下莖:

  • 類A依賴B類上

  • B類是依賴於A類

我的DI容器解決所有的以上。

我做出A級的呼叫並獲得注入的B類的一個實例...

這將導致容器中創建A類B類的新實例....

哪又注入了新的A級B級...等等...

我想這是我的一個基本的設計缺陷,但我看不出有什麼明顯的方式來解決這個問題。

任何想法?

public UserService 
{ 
    private readonly IUserRepository userRepo; 
    private readonly ITransactionService transactionService; 

    //ctor here.... 

    public ExampleUserMethod() 
    { 
     transactionService.GetTransactions(); 
     //do other things 
    } 

    public GetUsers() 
    { 
     //return users 
    } 


} 

public TransactionService 
{ 
    private readonly ITransactionRepository transactionRepo; 
    private readonly IUserService userService; 

    //ctor here.... 

    public ExampleTransactionMethod() 
    { 
     userService.GetUsers(); 
     //Do other things... 
    } 


    public GetTransactions() 
    { 
     //return transactions 
    } 

} 
+1

沒有代碼顯示,沒有什麼可以解決的。祝你好運!哦,要明顯地脫口而出:實例創建的時機太緊。 「其他」容器的實例化至少應該足夠緩慢,以便不會觸發無限循環。就像我說的,_with_代碼可能更有幫助 – sehe

+0

聽起來像一個糟糕的設計。 DI會爲你做的一件事是強化一些更好的設計。像其他人說的,需要一些代碼示例 –

+0

在 – stephen776

回答

3

一些容器支持循環引用,如果他們有一個生命週期。這樣,如果A ir請求它,則首先創建並添加到緩存中。然後創建B,因爲它是必需的依賴關係並分配給A.因爲B需要A的實例,所以請求A但不會再次創建,因爲它在緩存中找到並且已分配此現有實例。

但我建議不要使用此解決方案。你最好先試着打破循環引用。循環引用永遠不是一個好主意。例如。以你爲例:

public UserService 
{ 
    private readonly IUserRepository userRepo; 
    private readonly ITransactionStore transactionStore; 

    //ctor here.... 

    public ExampleUserMethod() 
    { 
     transactionStore.GetTransactions(); 
     //do other things 
    } 

    public GetUsers() 
    { 
     //return users 
    } 


} 

public TransactionService 
{ 
    private readonly ITransactionStore transactionStore; 
    private readonly IUserService userService; 

    //ctor here.... 

    public ExampleTransactionMethod() 
    { 
     userService.GetUsers(); 
     //Do other things... 
     transactionStore.AddTransaction(transaction); 
    } 
} 

public class TransactionStore 
{ 
    private readonly ITransactionRepository transactionRepo; 

    public GetTransactions() 
    { 
     //return transactions 
    } 

    public AddTransaction() 
    { 
     //return transactions 
    } 
} 
1

擁有約DI一些知識,從我的理解,不要緊與技術,你的模型循環依賴;無論如何實施,這樣做總是錯誤的。

如果你不使用DI,你的編譯器會通知你;現在,因爲您將其重定位到運行時,則稍後會發生錯誤,並且運行時會通知您。

所以我的建議是消除這種循環依賴。

+0

編譯器不會警告類之間的依賴關係。 'Foo級{吧檯; } class Bar {Foo foo;就編譯器而言''完全沒問題。 –

+0

@AnthonyPegram我讀「依賴」作爲「派生自」(即「是一個」,而不是「有」)。這是一個錯誤的假設嗎? –

+1

假設我會說非常錯誤。在談論依賴關係時,特別是在DI的背景下,我們談論的是組合,而不是繼承。 –

0

最顯而易見的方法來解決這個問題對我來說似乎把所有的東西都類和B類需要C類,並讓A類和B指(或獲得注入)C類

但沒有你試圖做一個具體的例子,很難說