MVC 单实例对象

MVC Single Instance Object

我需要在 MVC 应用程序中声明一个对象。这个对象消耗内存所以我需要它在应用程序启动时创建一次并且在回收之前不会被销毁。对象的同一实例也应该能够在控制器内跨应用程序访问。

我已经通过 InstanceContextMode.Single 在 WCF 服务中使用了这个对象并且效果很好。但是如何使用 MVC 呢?

我会实现单例模式https://msdn.microsoft.com/en-us/library/ff650316.aspx

如果您使用任何依赖注入容器,那么它们都支持单例实例

因为单例在很大程度上被认为是一种反模式。它们使您的代码难以测试(使用模拟和存根)并创建紧密耦合的代码。

由于这是非常糟糕的做法,您最好使用 IoC 容器(Unity、SimpleIoC、Autofac 等)来管理容器的生命周期。 Unity 3 IoC container 有一个 ContainerControlledLifetimeManager 生命周期管理器,其中对象创建一次并在容器的生命周期内返回相同的实例。

在您的组合根目录中,您可以这样做(使用 IMemoryConsumingService 接口来避免紧耦合)。然后将其注入您的控制器和服务。 Unity 3 示例(其他 IoC 具有类似程序)。

MemoryConsumingService service = new MemoryConsumingService();
container.RegisterInstance<IMemoryConsumingService>(service);

container.RegisterType<IMemoryConsumingService, MemoryConsumingService(new ContainerControlledLifetimeManager());

编辑:

安装 Unity 3.5 + Unity MVC Bootstraper 后,您基本上就可以开始使用了。

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

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

    public static void RegisterTypes(IUnityContainer container)
    {
        container.RegisterType<IDriver, Driver>(new ContainerControlledLifetimeManager());

        // OR 
        IDriver driver = new Driver();
        container.RegisterInstance<IDriver>(driver);
    }
}

RegisterType 方法中进行注册(请查看下面的文档 link,IoC 太复杂了,无法在简单的答案中进行解释)。较新的 nugetpackages 让您准备就绪,无需任何进一步更改(添加注册除外)。无需更改 Global.asax,因为它在早期的 Unity 中是必需的。