2010-06-10 75 views
6

在新的WPF項目(VS2010)中,我第一次使用Unity 2。 在這個項目中,我使用以下結構:如何在多項目解決方案中使用Unity進行解析

解決方案

WPF項目

類分享幫助

類Library2

類庫3 ....

的註冊使用Unity的不同類型在WPF項目中使用以下代碼片段完成:

IUnityContainer container = new UnityContainer() 
          .RegisterType<IObjectContext, ObjectContextAdapter>() 
          .RegisterType<IConnectionStringProvider, ConnectionStringProvider>() 
          .RegisterType(typeof(IRepository<>), typeof(Repository<>)); 

現在讓我們假設我想要在類庫1中解決構造器注入的構造器注入問題。 顯然容器在其他項目中是不知道的!

我該怎麼做?

回答

9

我大多數人都同意克里斯的回答,但我認爲配置文件是icky(特別是對於Unity),所以這裏有一個解決方案,允許您使用運行時配置W/O循環引用。我們將要與註冊管理機構合作。

創建將包含IConfigureUnity的基礎結構項目。

public interface IConfigureUnity 
{ 
    public void Configure(UnityContainer container); 
} 

您的每個類庫項目都將負責實現此接口來註冊它自己的類。

public class RegistryForSomeClassLibrary : IConfigureUnity 
{ 
    public void Configure(UnityContainer container) 
    { 
     container 
      .RegisterType<IObjectContext, ObjectContextAdapter>() 
      .RegisterType<IConnectionStringProvider, ConnectionStringProvider>() 
      .RegisterType(typeof(IRepository<>), typeof(Repository<>)); 
    } 
} 

然後在您的WPF項目中,您需要創建容器並應用這些註冊表。

var container = new UnityContainer(); 
new RegistryForSomeClassLibrary().Configure(container); 
new RegistryForAnotherClassLibrary().Configure(container); 

現在你有一個完全配置的容器實例w/o任何配置文件。

+0

假設我在Class Library 1中有一個名爲「ManageUser」的對話框。 ManageUser如何獲取WPF項目中聲明的容器實例? – 2013-08-09 17:01:25

+1

@Ryan - 是否有任何理由在一個通用項目中使用接口?爲什麼不使Registry類和Configure方法都是靜態的,並調用它:'RegistryForSomeClassLibrary.Configure(container); RegistryForAnotherClassLibrary.Configure(容器);'我測試了這個,它工作。我錯過了什麼嗎? – Shevek 2014-05-25 02:19:07

+0

@Shevek,這工作正常。我曾經使用反思來解決我的註冊問題,但是一段時間後放棄了。現在我明確地在每個註冊表中調用'Configure()'。 – Ryan 2014-05-25 02:52:48

0

要讓多個項目在此方案中使用相同的UnityContainer,您需要一個包含UnityContainer的「公共」項目,並將其公開,以便所有其他項目都可以訪問它。

WPF項目

類庫1

類庫2

類庫3

公用庫(UnityContainer住在這裏)

爲了避免循環項目依賴關係,我建議使用Unity design-time configuration via a configuration file而不是運行時配置(如在您的示例中所示)。否則,您的公共庫將不得不引用包含所有解析類型的項目,而這些項目又將依賴於公共庫(因爲大概您將公開UnityContainer實例的位置)。您可能能夠使用運行時配置來工作,但我沒有嘗試過;我知道設計時配置的工作原理與我完成的幾個項目完全一樣。

+0

謝謝克里斯,會試試看! – 2010-06-25 06:57:55

相關問題