2011-11-02 73 views
6

我已經開始使用Autofac下面這個教程: http://flexamusements.blogspot.com/2010/09/dependency-injection-part-3-making-our.htmlAutofac差異

簡單類無參數的構造函數

builder.RegisterType<ConsoleOutputService>().As<IOutputService>(); 

正如在本教程解釋,代碼上面的內容可以理解爲:設置ConsoleOutputService作爲IOutputService的實現

簡單的類有一個參數中的R構造

builder.Register(c => new MultipleOutputService(outputFilePath)).As<IOutputService>(); 

我不爲什麼使用lambda表達式來註冊這個類瞭解(並請問這個表情正是那樣),爲什麼我們不能輸入此代碼

builder.RegisterType<MultipleOutputService(outputFilePath)>().As<IOutputService>(); 

在此先感謝您的幫助

回答

9

您無法編寫該代碼,因爲它在C#中沒有意義。
RegisterType是一種通用的方法;通用方法必須採用類型作爲通用參數。你正試圖用一種自定義的方式註冊一個類型來創建它(在你的情況下,一個構造函數參數); C#支持指定這種事情的唯一方式是lambda表達式(或其他委託)。

+0

謝謝您的回答的情況下! – Swell

2

lambda變體使我們能夠在構造實例時執行一些邏輯。

+0

感謝您的快速回復! – Swell

2

順便說一句,有一個更好的解決方案,這個Autofac引入.WithParameter()擴展到他們的註冊生成器。

.RegisterType<MultipleOutputService>().As<IOutputService>().WithParameter("parameterName", "parameterValue"); 

這應該滿足你需要比一個接口類型以外的東西傳遞給您的構造函數之一

+0

這應該被標記爲答案,因爲它回答了真正的問題。 – gh9