【发布时间】:2012-08-24 15:34:58
【问题描述】:
我使用 autofac 并且可以将参数传递给我的 resolve 方法。
如何使用微软的 DependencyResolver 接口来做到这一点?
【问题讨论】:
标签: dependency-injection asp.net-web-api autofac
我使用 autofac 并且可以将参数传递给我的 resolve 方法。
如何使用微软的 DependencyResolver 接口来做到这一点?
【问题讨论】:
标签: dependency-injection asp.net-web-api autofac
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();
【讨论】:
一般建议是解决工厂问题。您可以为需要解析的类型定义自定义工厂接口(这是我的偏好),或者解析委托(这是 Peter Lillevold 的建议)。无论哪种方式,您都不应该直接调用容器(或DependencyResolver),因为这是sub optimal。
【讨论】: