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

时间:2014-07-14 13:44:44

标签: c# asp.net-mvc unity-container

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

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

Unity配置

    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不应该发生,对吧?

2 个答案:

答案 0 :(得分:1)

  

我尝试将要存储的数据设置为静态,因此无法获取   刷新,并在静态构造函数中实例化它,但是甚至   静态构造函数被多次调用。

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

答案 1 :(得分:0)

我通过创建一个依赖于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();