gpt4 book ai didi

c# - 使用 PerRequestLifetimeManager() 配置的 Unity 针对 WebApi 请求而非 MVC 请求创建多个 DbContext 实例

转载 作者:太空宇宙 更新时间:2023-11-03 14:38:56 36 4
gpt4 key购买 nike

这是我的 UnityConfig.cs:

public class UnityConfig
{
private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() =>
{
var container = new UnityContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
RegisterTypes(container);
return container;
});

public static IUnityContainer GetConfiguredContainer()
{
return container.Value;
}

public static void RegisterTypes(IUnityContainer container)
{
container.RegisterType<IProjectContext, ProjectContext>(new PerRequestLifetimeManager());
}
}

这是我的 UnityWebApiActivator.cs:

public static class UnityWebApiActivator
{
public static void Start()
{
Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule));

var container = UnityConfig.GetConfiguredContainer();
var resolver = new Microsoft.Practices.Unity.WebApi.UnityDependencyResolver(container);
GlobalConfiguration.Configuration.DependencyResolver = resolver;
}

public static void Shutdown()
{
var container = UnityConfig.GetConfiguredContainer();
container.Dispose();
}
}

逐步执行代码,我可以看到使用适当的注册创建了我的容器。

这是一个示例 WebAPI Controller :

[Authorize]
public class ProjectApiController : BaseApiController
{
private readonly ProjectService _projectService;

public ProjectApiController(ProjectService projectService)
{
_projectService = projectService;
}

[Route("api/project")]
[AcceptVerbs("POST")]
public HttpResponseMessage SendProject(ProjectDto projectDto)
{
return Request.CreateResponse(HttpStatusCode.OK, _projectService.SendProject(GetUsername(), projectDto));
}
}

虽然我的 ProjectService 构造函数如下所示:

public class ProjectService : BaseService
{

public readonly ProjectContext _db;
public readonly NotificationService _notificationService;

public ProjectService(ProjectContext db, NotificationService notificationService)
{
_db = db;
_notificationService = notificationService;
}
// methods here
}

MVC Controller 和 API Controller 都依赖于 ProjectService,但 WebAPI 请求的行为不同。当提供 MVC 请求时,我会根据需要创建一个 ProjectContext 实例。当提供 WebAPI 请求时,每次注入(inject)都会创建一个新实例。这是不希望的。

为什么会这样?

更新:

根据 below answer , 我变了

DependencyResolver.SetResolver(new UnityDependencyResolver(container));

DependencyResolver.SetResolver(new UnityHierarchicalDependencyResolver(container));

这导致:

The type Microsoft.Practices.Unity.WebApi.UnityHierarchicalDependencyResolver does not appear to implement Microsoft.Practices.ServiceLocation.IServiceLocator. Parameter name: commonServiceLocator

这导致我 here ,其中推荐的解决方案导致:

enter image description here

我目前有:

  • 统一 4.0.1
  • Unity.AspNet.WebApi 4.0.1
  • Unity.Mvc 4.0.1
  • Unity.MVC5 1.2.3

升级软件包是目前的最后手段。

最佳答案

我们在 net core 2.2 应用程序中的 dbContext (EF Core) 以及 SimpleInjector 库中遇到了类似的问题。无论我们提供什么生命周期值,dbContext 生命周期都没有得到正确设置。最糟糕的是故障是断断续续的,这让我们更难找出原因。

我们发现我们注册了 dbContext 两次,一次是在 netcore 的 DI 容器中,第二次是在 SimpleInjector 容器中,这导致了各种问题。

因此,我建议您检查一下您是否也注册了两次。仅供引用,如果是这种情况,那么建议是摆脱其中一个,因为设置相同的生命周期值对我们不起作用。

关于c# - 使用 PerRequestLifetimeManager() 配置的 Unity 针对 WebApi 请求而非 MVC 请求创建多个 DbContext 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58469938/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com