MVC单实例对象

时间:2015-03-10 08:50:42

标签: asp.net-mvc model-view-controller instancecontextmode

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

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

2 个答案:

答案 0 :(得分:1)

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

如果您正在使用任何依赖注入容器,则所有这些容器都支持Singleton Instance

答案 1 :(得分:0)

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

由于这是非常糟糕的做法,因此最好使用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方法中进行注册(请查看下面的文档链接,IoC很复杂,可以在一个简单的答案中解释它)。较新的nugetpackages让您准备好了,没有任何进一步的更改(除了添加注册)。无需更改Unity早期所需的Global.asax。