2012-08-10 98 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