Для моего ASP.NET Web API проекта, у меня есть следующие настройки, которые используют Autofac как контейнер IoC:Autofac OwnedInstances и ASP.NET Web API в
protected void Application_Start(object sender, EventArgs e)
{
HttpConfiguration config = GlobalConfiguration.Configuration;
config.DependencyResolver =
new AutofacWebApiDependencyResolver(
RegisterServices(new ContainerBuilder()));
config.Routes.MapHttpRoute("DefaultRoute", "api/{controller}");
}
private static IContainer RegisterServices(ContainerBuilder builder)
{
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterType<ConfContext>().InstancePerApiRequest();
return builder.Build();
}
И у меня есть следующий обработчик сообщений который извлекает экземпляр ConfContext
просто для удовольствия:
public class MyHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
ConfContext ctx = (ConfContext)request.GetDependencyScope().GetService(typeof(ConfContext));
return base.SendAsync(request, cancellationToken);
}
}
Как мой обработчик сообщений будет вызываться до того, как контроллер будет построен, я должен получить тот же экземпляр ConfContext
на контроллере. Тем не менее, я хочу получить отдельные экземпляры, если попытаюсь получить ConfContext
как Func<Owned<ConfContext>>
, но я получаю тот же экземпляр. Если я удалю регистрацию InstancePerApiRequest
, я потеряю поддержку API Per API в случаях, когда я хочу просто получить ConfContext
, как есть.
Есть ли способ поддержать оба случая здесь?
Редактировать
Пример приложения здесь: https://github.com/tugberkugurlu/EntityFrameworkSamples/tree/master/EFConcurrentAsyncSample/EFConcurrentAsyncSample.Api