我使用 autofac 并且可以将参数传递给我的 resolve 方法。
如何使用微软的 DependencyResolver 接口来做到这一点?
我使用 autofac 并且可以将参数传递给我的 resolve 方法。
如何使用微软的 DependencyResolver 接口来做到这一点?
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();
一般的建议是解决工厂。您可以为需要解析的类型定义自定义工厂接口(这是我的偏好),或者解析委托(这是 Peter Lillevold 的建议)。无论哪种方式,您都不应该直接调用容器(或DependencyResolver
就此而言),因为这是次优的。