【问题标题】:Using Autofac Ioc InstancePerHttpRequest with Servicestack 5.1.0将 Autofac Ioc InstancePerHttpRequest 与 Servicestack 5.1.0 一起使用
【发布时间】:2018-07-30 05:04:36
【问题描述】:

我们最近将我们的 API(使用表单身份验证)Servicestack 版本 4.0.40 升级到了 Servicestack 的最新稳定版本 (V5.1.0)。我们使用 API 的 InstancePerHttpRequest 使用 Autofac Ioc 注册(这是使用 Autofac.Mvc4 包中的 Autofac.Integration.Mvc)。

以下代码在 servicestack 升级后不再工作。

this.UseAutofac(afcBuilder.Build());

错误 CS0012 类型“ServiceStackHost”在程序集中定义 没有被引用。您必须添加对程序集的引用 'ServiceStack,版本=4.0.48.0,文化=中性, PublicKeyToken=null'。

因此,我们尝试了使用 InstancePerDependency 使其工作的替代方法,但这会导致 API 身份验证后缺少“ASP.NET_SessionId”cookie 值。

请建议代码以使实际的“InstancePerHttpRequest”与最新的 ServiceStack 版本一起工作。

【问题讨论】:

    标签: autofac


    【解决方案1】:

    我已经回答了this question in ServiceStack Customer Forums,但为了其他人的利益,我将在下面包含类似问题:

    问题不在于 ServiceStack 或 AutoFac,而在于您的依赖项之一仍然具有对 ServiceStack 的旧 v4.0.48 的二进制引用(在异常中突出显示)。您不能混合和匹配来自不同版本的 ServiceStack .dll,因此您需要重新编译具有旧二进制 ServiceStack 引用的任何程序集以使用您正在使用的 ServiceStack 版本。

    Autofac 对 ServiceStack 没有依赖项,它是您在 Autofac 中注册的依赖项之一。您可以使用像 JetBrains dotpeek 这样的程序集检查器并检查项目中每个 dll 引用的 .dll 引用,或者注释掉注册,直到找到具有依赖关系的那个。


    基本上您不太可能关注 ServiceStack 或 Autofac .dll,您需要找到引用 ServiceStack v4.0.48.dll 并重新编译以使用您升级到的 ServiceStack 版本。

    如果您查看 Autofac.Mvc4 的依赖关系,您会发现它只依赖于 Autofac。 Autofac 不会依赖于 ServiceStack v4.0.48,您自己的 .dll 之一将具有导致问题的旧二进制引用。

    【讨论】:

    • 感谢mythz,它是引用旧服务堆栈版本的外部包(Autofac.Extras.Servicestack)之一。这用于使 InstancePerHttpRequest 工作,因为我们不能将 InstancePerLifetimeScope 用于 API。您能否为 API 的 Autofac 实现建议替代方法,以与 InstancePerHttpRequest 或类似的东西一起使用。尝试了同样的方法和 InstancePerRequest,但出现错误消息“在请求实例的范围内,没有标签匹配 'AutofacWebRequest' 的范围可见。”
    • @Kalyan 我不熟悉 Autofac,但我不鼓励使用请求范围,因为请求范围在大多数情况下都是非最佳的,并且是此类问题的根源。基本上我建议如果依赖项是线程安全的,它应该注册为单例,否则将其注册为临时依赖项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多