2

你好再次stackoverflowians,向Castle Windsor註冊一般類型和服務IoC

我認爲是時候瞭解瞭如何使用DI框架。我聽說過很多關於溫莎城堡的好消息,所以我決定採取這種做法。現在有很多關於如何使用它的教程,但是,我無法找到關於泛型所涉及的操作的很多有用信息。這是我的問題。

我有一個BaseDAO

namespace Utilities.DataAccess 
{ 
    public class BaseDAO<T> : IBaseDAO<T> 
    { 
     public BaseDAO(IConnectionProvider _connectionProvider) 
     { 
      // Stuff 
     } 
    } 
} 

林在這種情況下仿製藥一點點新的,我已經看到了一些教程,有一個「BaseDAO」沒有通用的聲明,並簡單地將其與泛型實現接口在上面。我在以前的許多項目(沒有IoC)上使用了上述方式做事,它對我來說工作得很好......反正,從App.config開始!

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section 
     name="castle" 
     type="Castle.Windsor.Configuration.AppDomain.CastleSectionHandler, Castle.Windsor"></section> 
    </configSections> 

    <castle> 
    <components> 

     <component 
     id="BaseDAO" 
     service="Utilities.DataAccess.Interfaces.IBaseDAO`1, Utilities.DataAccess" 
     type="Utilities.DataAccess.BaseDAO`1, Utilities.DataAccess" /> 

     <component 
     id="NHibernateConnection" 
     service="Utilities.DataAccess.ConnectionProviders.IConnectionProvider, Finchtils" 
     type="Utilities.DataAccess.ConnectionProviders.NHibernateConnection" /> 

     <component 
     id="XMLConnection" 
     service="Utilities.DataAccess.ConnectionProviders.IConnectionProvider, Finchtils" 
     type="Utilities.DataAccess.ConnectionProviders.XMLConnection, Utilities" /> 
    </components> 
    </castle> 
</configuration> 

現在,作爲您現在可能想到的一些,這是一個實用程序庫。我打算爲我創建的每個項目使用此程序集,以便我不必編寫相同的數據訪問代碼,這些代碼在所有解決方案中保持不變。這樣做的含義當然是,我不能告訴城堡到底是什麼類型的參數傳遞給BaseDAO,在一個項目中它可能是一個Customer對象,另一個完全不同。我在其他論壇上讀到過,這完全有可能,因爲當你從容器中請求對象時,你可以指定類型,

BaseDAO<Customer> baseDao = container.Resolve<BaseDAO<Customer>>(); 

雖然這是對我的設計工作,我曾嘗試使用下面的符號在App.config

<component 
    id="BaseDAO" 
    service="Utilities.DataAccess.Interfaces.IBaseDAO`1[[Utilities.DataInterface.IEntity]], Finchtills.DataAccess" 
    type="Utilities.DataAccess.BaseDAO`1[[Utilities.DataInterface.IEntity]], Finchtils.DataAccess" /> 

然而,這並沒有任何工作,在任何情況下,我得到以下錯誤:

Utilities.Testing.DataAccess.Unit.Testing_BaseDAO (TestFixtureSetUp): 
System.Exception : The type name Utilities.DataAccess.BaseDAO`1, Utilities.DataAccess could not be located. 
    ----> System.IO.FileNotFoundException : Could not load file or assembly 'Utilities.DataAccess' or one of its dependencies. The system cannot find the file specified. 

閱讀這個錯誤,我覺得可能是兩兩件事之一:

  1. 我從配置文件丟失的東西做類型和服務的泛型。

  2. 我已經錯誤地命名了一些內容I.E程序集名稱。

我已經治療程序集名稱作爲項目包含在內,換句話說項目,在任何時候都我用<solution name>.<project name>.<item folder>.<item name>但只是在項目層面開始...我認爲任何配置選項會知道它被調用的是什麼解決方案。

謝謝你對這個問題可能給予的任何幫助。

+1

爲什麼使用XML進行配置而不是代碼? http://stw.castleproject.org/Windsor.Three-Calls-Pattern.ashx – 2010-08-02 10:06:11

+0

「讓我們將此配置放在代碼的外部,這樣我們就可以擁有更多的靈活性,並且我們可以在不重新編譯應用程序的情況下進行更改。」 - Castle Windsor入門指南的建議。 – user407356 2010-08-02 13:15:38

+0

而點擊該鏈接後,你發佈我看到: 回報新WindsorContainer() .Install(Configuration.FromAppConfig(), FromAssembly.This() 其實從定義組件的App.config調用配置的代碼嗎。我認爲這意味着這個網站也建議你通過xml註冊組件。 – user407356 2010-08-02 13:19:54

回答

1

集名稱可以在Visual Studio因此,可以發現:

  • 在解決方案資源管理器中,雙擊屬性節點
  • 打開應用程序選項卡
  • 大會名稱靠近右上角

或者,如果您在命令行編譯,則使用/out參數。

此外,您需要指定類型參數的程序集(在方括號內)。因此,假設你所有的類型都在數據訪問組件,並且該組件被稱爲(爲簡潔起見)「數據訪問」:

<component 
    id="BaseDAO" 
    service="Utilities.DataAccess.Interfaces.IBaseDAO`1[[Utilities.DataInterface.IEntity, DataAccess]], DataAccess" 
    type="Utilities.DataAccess.BaseDAO`1[[Utilities.DataInterface.IEntity, DataAccess]], DataAccess" /> 

但我與其他評論者認爲,這是更好地做註冊代碼。你不必使用冗長的類型語法,你可以通過編譯器檢查你的類型。但是有一些缺點:很難判斷你是否有未使用的類型,因爲註冊調用算作使用類型。

+0

感謝您的示例代碼片。 – VIJAY 2012-02-10 12:50:35

相關問題