我一直在嘗試使用命名委託而不是單一方法的接口。這對代碼的大小一定的優勢,因爲我們可以從(一些換行符刪除,以免誇大的情況下)去:有沒有簡單的方法來註冊Castle Windsor的靜態封閉?
public interface IProductSource
{
IEnumerable<Product> GetProducts();
}
public class DataContextProductSource : IProductSource
{
private readonly DataContext _DataContext;
public DataContextProductSource(DataContext dataContext)
{
if (dataContext == null) throw new ArgumentNullException("dataContext");
_DataContext = dataContext;
}
public IEnumerable<Product> GetProducts()
{
return _DataContext.Products.AsEnumerable();
}
}
到:
public delegate IEnumerable<Product> DGetProducts();
public static class DataContextFunctions
{
public DGetProducts GetProducts(DataContext dataContext)
{
if (dataContext == null) throw new ArgumentNullException("dataContext");
return() => dataContext.Products.AsEnumerable();
}
}
這基本上是走的事實的優點:一旦你用依賴注入進行得足夠遠,許多類就不再僅僅是關閉了。這些類可以被返回lambda表達式的函數替換。然後可以將整套相關函數(不需要封裝任何可變狀態,但是已經使用「標準」依賴注入中的類表示)集中到靜態類(或VB中的「模塊」)中, 。
這一切都很好,但我很難找到與Castle Windsor一起註冊這些靜態方法的最佳方法。不依賴的方法很容易:
Component.For<DGetIntegers>().Instance(Integers.GetOneToTen)
但是我們的DataContextFunctions.GetProducts從上面有一些依賴關係。我發現註冊這個最好的辦法是:
Component.For<DGetProducts>().UsingFactoryMethod(
kernel => DataContextFunctions.GetProducts(kernel.Resolve<DataContext>())
這可以得到相當冗長,顯然不必直接請求內核每個依存性的那種失敗的點位。在我看來,容器應該需要的所有靜態信息都是可用的,所以應該可以做到這一點。
現在的問題是,Castle Windsor(或任何其他容器)是否有簡單的方法來做到這一點,我已經錯過了,或者出現了技術問題,或者它只是一個小例子包括在內呢?
謝謝,Krzysztof。我會在某個時候嘗試一下並報告結果。任何鏈接的好地方開始? – ninjeff
@ninjeff如果你在2.5.x文檔應該讓你開始docs.castleproject.org/(S(hucszcu5ilznbv45fvrim355))/...如果你在3.0測試版,有一些API的變化,雖然概念仍然是相同。讓我知道如果DOCO是不完美的 –
我能夠得到這個工作。我會在一個小時內用我自己的答案發布鏈接和描述(像我這樣的低業力用戶無法在八小時內回答我們自己的問題)。 – ninjeff