【问题标题】:Autofac InstancePerLifetimeScope in Web API modelsWeb API 模型中的 Autofac InstancePerLifetimeScope
【发布时间】:2015-08-30 11:29:59
【问题描述】:

我在为 Web API 2.2 中的模型设置依赖注入时遇到问题。具体来说,我目前这样做的方式会导致任何“InstancePerLifetimeScope”依赖项都表现为“SingleInstance”依赖项。

这是我目前使用 JSON.NET 解析器所做的事情:

public class AutofacContractResolver : DefaultContractResolver
{
    private readonly IContainer _container;

    public AutofacContractResolver(IContainer container)
    {
        _container = container;
    }

    protected override JsonObjectContract CreateObjectContract(Type objectType)
    {
        JsonObjectContract contract = base.CreateObjectContract(objectType);

        if (_container.IsRegistered(objectType))
            contract.DefaultCreator = () => _container.Resolve(objectType);

        return contract;
    }
}

_container.Resolve(objectType) 为每个请求解析相同的实例。这造成了严重破坏,因为我现在在两个不同的会话上运行服务,其中一个已经过时了。

我认为 Resolve 调用是在创建请求范围之前发生的。它将解释上述行为,但我不确定如何解决这个问题。

【问题讨论】:

  • 你能展示你设置合约解析器的代码吗?

标签: asp.net-web-api autofac


【解决方案1】:

考虑使用 ILifetimeScope 而不是 IContainer。

public class AutofacContractResolver : DefaultContractResolver
{
    private readonly ILifetimeScope _container;

    public AutofacContractResolver(ILifetimeScope container)
    {
        _container = container;
    }

    protected override JsonObjectContract CreateObjectContract(Type objectType)
    {
        JsonObjectContract contract = base.CreateObjectContract(objectType);

        if (_container.IsRegistered(objectType))
            contract.DefaultCreator = () => _container.Resolve(objectType);

        return contract;
    }
}

【讨论】:

  • 不幸的是,行为与 ILifetimeScope 相同。但是我确实注意到 ILifetimeScope 标记是“root”——这进一步证明 ContractResolver 在 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
相关资源
最近更新 更多