【问题标题】:DependencyResolver: Pass parametersDependencyResolver:传递参数
【发布时间】:2012-08-24 15:34:58
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    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();
    

    【讨论】:

    • 这似乎是个好主意,但如果我使用不同的上下文,这会起作用吗?对象应注册为 .InstancePerHttpRequest();或 .InstancePerApiRequest();
    • @user437899 - 添加了一些关于生命周期范围的输入。希望它澄清:)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-07-06
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      相关资源
      最近更新 更多