1

我需要在 Orchard 模块中实现一个单例。在阅读有关 ISingletonDependency 的信息时,我认为这一定是答案,但我的类型从未实例化。

这是我用于测试的代码。在我的模块项目的根级别的单个文件中实现。

using Orchard;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace SingletonTestModule
{
    public interface IMySingleton : ISingletonDependency
    {
    }

    public class MySingleton : IMySingleton
    {
        public MySingleton()
        {
        }
    }
}

我还需要做什么才能让 orchard shell 实例化我的单例?

4

1 回答 1

3

ISingleton 建立的契约是,在给定的 Orchard 实例下,每个租户只有一个该类的实例(请注意,这是每个租户,而不是像“静态”实现那样每个应用程序域)。何时创建该实例取决于您:您第一次要求注入该类时,该实例将被创建并注入。下次您请求它时,您将获得与第一次相同的实例。

关于何时使用单例的快速说明:几乎从不。单例的合法用例非常少,这些通常深入到框架中,而不是应用程序代码中(实现缓存 API 和全局存储是可能的)。有关该模式的批评的一些链接,请参阅Wikipedia:“有人批评使用单例模式,因为有些人认为它是一种反模式,判断它被过度使用,在类的唯一实例的情况下引入了不必要的限制实际上并不是必需的,而是将全局状态引入应用程序。”

大多数时候,我看到人们想在 Orchard 中使用单例,他们也可以使用常规的 IDependency 类以及一些缓存。

您可能有一个合法的用例,但我仍在为其他找到此答案的人添加此用例。

于 2013-11-06T23:45:31.097 回答