Web API 2 - Unity IOC - 每个请求变量的共享实例

时间:2014-11-24 08:16:05

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

我正在使用带有统一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可以调用亚马逊。

1 个答案:

答案 0 :(得分:0)

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

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

此外,您可能希望检查要尝试实例化的类构造函数,以解决速度太慢的问题。如果适用,也可以考虑使用延迟加载。