你好再次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.
閱讀這個錯誤,我覺得它可能是兩兩件事之一:
我從配置文件丟失的東西做類型和服務的泛型。
我已經錯誤地命名了一些內容I.E程序集名稱。
我已經治療程序集名稱作爲項目包含在內,換句話說項目,在任何時候都我用<solution name>.<project name>.<item folder>.<item name>
但只是在項目層面開始...我認爲任何配置選項會知道它被調用的是什麼解決方案。
謝謝你對這個問題可能給予的任何幫助。
爲什麼使用XML進行配置而不是代碼? http://stw.castleproject.org/Windsor.Three-Calls-Pattern.ashx – 2010-08-02 10:06:11
「讓我們將此配置放在代碼的外部,這樣我們就可以擁有更多的靈活性,並且我們可以在不重新編譯應用程序的情況下進行更改。」 - Castle Windsor入門指南的建議。 – user407356 2010-08-02 13:15:38
而點擊該鏈接後,你發佈我看到: 回報新WindsorContainer() .Install(Configuration.FromAppConfig(), FromAssembly.This() 其實從定義組件的App.config調用配置的代碼嗎。我認爲這意味着這個網站也建議你通過xml註冊組件。 – user407356 2010-08-02 13:19:54