DependencyResolver:传递参数

时间:2012-08-10 12:24:29

标签: dependency-injection asp.net-web-api autofac

我使用autofac并可以将参数传递给我的resolve方法。

如何使用microsofts DependencyResolver接口执行此操作?

2 个答案:

答案 0 :(得分: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范围内可用。尝试从X范围解析application将失败,并显示以下消息:

  

范围内不会显示带有匹配'http'的标记的范围       其中请求实例。

request范围解析将按预期工作:

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

答案 1 :(得分:0)

一般建议是解决工厂问题。要么为需要解决的类型定义自定义工厂接口(这有我的偏好),要么解析委托(这是Peter Lillevold所建议的)。无论哪种方式,您都不应该直接调用容器(或DependencyResolver),因为这是sub optimal