我使用autofac并可以将参数传递给我的resolve方法。
如何使用microsofts DependencyResolver接口执行此操作?
答案 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。