0
A
回答
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
一般的建議是解決一個工廠。要麼爲您需要解決的類型定義自定義工廠界面(這有我的偏好),要麼解決委託(這是Peter Lillevold建議的)。無論哪種方式,您都不應直接致電容器(或DependencyResolver
),因爲這是sub optimal。
相關問題
這似乎是一個好主意,但如果我使用不同的上下文將這項工作?這些objcts應該被註冊爲.InstancePerHttpRequest();或.InstancePerApiRequest(); – user437899 2012-08-22 09:10:20
@ user437899 - 在生命週期範圍內添加了一些輸入。希望它澄清:) – 2012-08-24 07:35:37