Unity RegisterInstance在每个请求中重新创建singleton

本文关键字:新创建 创建 singleton RegisterInstance 请求 Unity | 更新日期: 2023-09-27 18:12:54

我正在尝试使用Unity将对象设置为单例,但每次我发出请求时都会创建该对象。

public class ShareTubeRoomRepository : IShareTubeRoomRepository
{
    public ShareTubeRoomRepository()
    {
        //load my base data
    }

统一配置

    public static void RegisterTypes(IUnityContainer container)
    {
        container.RegisterInstance<IShareTubeRoomRepository>(new ShareTubeRoomRepository(), new ContainerControlledLifetimeManager());
    }

我还尝试了以下操作:

container.RegisterType<IShareTubeRoomRepository, ShareTubeRoomRepository>(new ContainerControlledLifetimeManager());

我在存储库的构造函数中放置了一个断点,并且每次在MVC应用程序中加载页面时都会调用它。我找到的所有资源都说,这些注册类型的方法应该将其创建为单例,那么为什么每次请求都要重新创建这个实例呢?

我试图使我想要存储的数据static,所以它不会得到刷新,并在静态构造函数中实例化它,但即使是静态构造函数被调用多次。根据这个答案:https://stackoverflow.com/a/5119154/526704这不应该发生,对吧?

Unity RegisterInstance在每个请求中重新创建singleton

我试着让我想要存储静态的数据,所以它不会得到刷新,并在静态构造函数中实例化它静态构造函数被多次调用。

这意味着您的应用程序中有多个AppDomains。我想你是在IIS上运行它,有多个worker。在这种情况下,它将为每个AppDomain创建一个单例。请确保使用单个AppDomain。

我通过创建一个依赖于使用HttpContext.Current.Application字典(https://stackoverflow.com/a/3733549/526704)的属性来解决这个问题

System.Web.HttpContext.Current.Application.Lock();
System.Web.HttpContext.Current.Application["Name"] = "Value";
System.Web.HttpContext.Current.Application.UnLock();