【问题标题】:Web API 2 - Unity IOC - Shared instance per request variableWeb API 2 - Unity IOC - 每个请求变量的共享实例
【发布时间】:2014-11-24 08:16:04
【问题描述】:

我正在使用带有统一 IOC 的 web api。

web api 客户端在请求标头中传递 client-id,并基于此值解析依赖关系以创建外部 dll 的方法实例。

创建此实例大约需要 6-7 秒,这会在 web api 中产生性能问题。

我想要的是防止在标头中为具有相同客户端 ID 的调用创建实例。

这是我到目前为止的实现方式:-

//========================== ArchiveFactory ==========================
        ArchiveFactory archiverFactory = (HttpRequest httpRequest) =>
        {
            container.RegisterType<IArchive, Archive>("Archive",
            new HierarchicalLifetimeManager(),
            new InjectionConstructor(
                new ResolvedParameter<IStoreClient>(),
                Helper.GetArchiveContext(httpRequest))
                );
            return container.Resolve<IArchive>("Archive");
        };
        container.RegisterInstance(archiverFactory);

具体我的要求 - 我正在调用亚马逊服务来检索图像,并且有一个调用亚马逊的公司 dll。

【问题讨论】:

  • 只是为了添加更多 - 我想拥有一个静态的实例集合。稍后我可以检查实例是否可用于特定请求,然后才创建新实例。
  • 嗨 container.Resolve 需要 6-7 秒?创建实例花费最多的时间在哪里?
  • T 的构造函数必须与其他服务建立会话。这就是为什么我想只构建一次 T 并将其用于任何进一步的相同请求。

标签: asp.net-web-api dependency-injection inversion-of-control unity-container asp.net-web-api2


【解决方案1】:

您可以在控制器/API 层使用缓存机制(例如 Strathweb.CacheOutput.WebApi2),您可以像下面这样装饰控制器方法。它可以根据参数进行缓存,因此如果请求带有相同的参数,它将从缓存中返回结果。

[HttpGet]
[Route("")]
[CacheOutput(ServerTimeSpan = 60, ExcludeQueryStringFromCacheKey = true)]
public IHttpActionResult GetProducts(string clientId)
{
    var product = new List<Product>();
    return Ok(product);
}

此外,您可能需要检查您尝试实例化的类构造函数是否存在运行速度太慢的问题。如果适用,您也可以考虑使用延迟加载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多