MVC4 C# 项目:在整个应用程序中提供对象的单个实例

MVC4 C# Project: Provide a single instance of an object across the application

背景 在提出我的实际问题之前,我将在这里提供背景信息:

我正在使用 C# 开发一个 ASP.NET MVC 4 项目。我目前忙于的开发任务是在此 Web 应用程序中实现 RazorMachine (https://github.com/jlamfers/RazorMachine),以便在我的应用程序层(而不是纯粹在 MVC Web 层)中利用 Razor 引擎。我已经在一系列测试装置中成功实施了 RazorMachine,并且一切正常。现在,我需要将它实现到我的应用程序层内的应用程序架构中。

在他关于 RazorMachine (http://www.codeproject.com/Articles/423141/Razor-2-0-template-engine-supporting-layouts) 的 CodeProject 文章中,Jaap Lamfers 指出 "Please note that normally for performance reasons at any application you would create a singleton instance of RazorMachine (because of the inner instance bound JIT created type caching)"。

一个非常基本的代码示例如下:

RazorMachine rm = new RazorMachine();
ITemplate template = rm.ExecuteContent("Razor says: Hello @Model.FirstName @Model.LastName", 
  new {FirstName="John", LastName="Smith"});
Console.WriteLine(template.Result);

您可以在 CodeProject 网站上查看更多代码示例。

以此为背景,我的问题如下:

向我的 MVC 应用程序提供 RazorMachine 对象的单个实例的最佳方法是什么?

声明一下,我知道单例模式和工厂模式及其可能的实现。但是,使用 Singleton 似乎不太合适,因为我不是从头开始编写 class,class 已经存在。 factory好像也不太合适,不过我想听听别人怎么说。

所有意见将不胜感激。

获取 RazorMachine 单例实例的最快、最简单的方法是使用您选择的 DI 容器,众所周知的 DI 容器的示例是 Autofac、Ninject、Castle Windsor、Unity、StructureMap(请参阅此link 主要 .NET Ioc/DI 容器的性能比较:http://www.palmmedia.de/blog/2011/8/30/ioc-container-benchmark-performance-comparison)

这些容器从开发人员那里抽象出正确实现单例模式的责任。

使用 Autofac,要注册 class 的单例实例,您需要执行以下操作:

var builder = new ContainerBuilder();
builder.RegisterType<YourClassGoesHere>().SingleInstance();

参考:http://autofac.readthedocs.org/en/latest/lifetime/instance-scope.html#single-instance