2012-08-10 37 views

回答

3

IDependencyResolver不支持直接傳遞參數,因爲我相信你已經注意到了。不過,既然你有Autofac在引擎蓋下,你能解決工廠的委託,使您能夠在參數傳遞到底層服務:

var factory = dependencyResolver.GetService<Func<int, string, IService>>(); 
var service = factory(5, "42"); 

注意:您可以使用Func委託或明確定義工廠與會代表。更多關於here

關於生命週期範圍:必須從能夠「達到」所請求服務的範圍解決工廠代理。考慮這個設置模擬MVC還是怎麼的WebAPI會是什麼樣子:

var cb = new ContainerBuilder(); 
cb.RegisterType<X>().InstancePerMatchingLifetimeScope("http"); 
var application = cb.Build(); 
var request = application.BeginLifetimeScope("http"); 

在此設置下,我們的X服務將只能在HTTP範圍內都有效。試圖從application範圍解決X將失敗,此消息:

沒有範圍與標籤配套的「http」是其中要求該實例的範圍 可見。

request範圍解決將如預期:

var f = request.Resolve<Func<IX>>(); 
var x = f(); 
+0

這似乎是一個好主意,但如果我使用不同的上下文將這項工作?這些objcts應該被註冊爲.InstancePerHttpRequest();或.InstancePerApiRequest(); – user437899 2012-08-22 09:10:20

+0

@ user437899 - 在生命週期範圍內添加了一些輸入。希望它澄清:) – 2012-08-24 07:35:37

0

一般的建議是解決一個工廠。要麼爲您需要解決的類型定義自定義工廠界面(這有我的偏好),要麼解決委託(這是Peter Lillevold建議的)。無論哪種方式,您都不應直接致電容器(或DependencyResolver),因爲這是sub optimal