0

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

如何使用微软的 DependencyResolver 接口来做到这一点?

4

2 回答 2

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 范围内可用。尝试Xapplication范围解析将失败,并显示以下消息:

从请求实例的范围中看不到带有与“http”匹配的标记的范围。

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

var f = request.Resolve<Func<IX>>();
var x = f();
于 2012-08-10T13:12:27.297 回答
0

一般的建议是解决工厂。您可以为需要解析的类型定义自定义工厂接口(这是我的偏好),或者解析委托(这是 Peter Lillevold 的建议)。无论哪种方式,您都不应该直接调用容器(或DependencyResolver就此而言),因为这是次优的。

于 2012-08-10T13:24:25.387 回答