C# 通过实现接口创建单例类有什么好处?

C# 通过实现接口创建单例类有什么好处?,c#,C#,如果我有下面这样的界面 public interface IMethods { void M1(); void M2(); } 然后我想通过继承上面的接口来创建一个单例类,那么重复使用单例类的好处是什么?我不完全确定你在问什么,但是如果你问“作为单例实现这个接口有什么好处”,答案是单例总是提供的相同好处:“一个实例的保证,无论它使用了多少个位置”。Singleton的存在是为了强制一个具有实例访问权限的类的单个实例,而不是静态类和方法/属性。示例实现: public

如果我有下面这样的界面

 public interface IMethods
  {
    void M1();
    void M2();
  }

然后我想通过继承上面的接口来创建一个单例类,那么重复使用单例类的好处是什么?我不完全确定你在问什么,但是如果你问“作为单例实现这个接口有什么好处”,答案是单例总是提供的相同好处:“一个实例的保证,无论它使用了多少个位置”。Singleton的存在是为了强制一个具有实例访问权限的类的单个实例,而不是静态类和方法/属性。示例实现:

public class Methods : IMethods
{
    // Singleton instance
    private static readonly IMethods _instance = new Methods();

    // Private constructor to enforce singleton
    private Methods()
    {

    }

    // The instance getter
    public static IMethods Instance
    {
        get
        {
            return _instance;
        }
    }

    public void M1()
    {

    }

    public void M2()
    {

    }
}
这里要告诉您的是,
Instance
属性未在
IMethods
接口上公开,因此获取它需要实例类型为
Methods
而不是
IMethods
,这有点违背了继承接口的目的


通常,人们使用依赖注入框架将接口实现的生命周期设置为singleton(也称为共享实例)。它更“面向对象友好”。

我不完全确定你在问什么,但如果你问“作为singleton实现此接口有什么好处?”答案和singleton提供的好处是一样的:“一个实例的保证,不管它被使用了多少个地方”。Singleton的存在是为了通过实例访问而不是静态类和方法/属性来强制类的单个实例。一个示例实现:

public class Methods : IMethods
{
    // Singleton instance
    private static readonly IMethods _instance = new Methods();

    // Private constructor to enforce singleton
    private Methods()
    {

    }

    // The instance getter
    public static IMethods Instance
    {
        get
        {
            return _instance;
        }
    }

    public void M1()
    {

    }

    public void M2()
    {

    }
}
这里要告诉您的是,
Instance
属性未在
IMethods
接口上公开,因此获取它需要实例类型为
Methods
而不是
IMethods
,这有点违背了继承接口的目的


通常,人们使用依赖注入框架将接口实现的生命周期设置为singleton AKA共享实例。它更“面向对象友好”。

单例方面只是
IMethods
契约的一个实现,假设您需要单例模式,那么它将为您带来好处

通过接口公开该单例的好处是,消费者不需要关心它是如何实现的,只需要它是如何实现的,并且他们可以使用它。在以后的某个日期,如果您突然需要一个常规实例而不是单例实例,您可以在不影响消费者的情况下更改它

这种情况在DI容器中非常常见,您通常可以将绑定的生命周期配置为在单例范围内


如果您直接使用单例,而从未真正使用过接口,那么接口中就没有什么用处了。如果使用单例时不需要将其约束到单个实例,那么采用单例模式就没有什么用处。

单例方面只是
IMethods
契约的一个实现,假设您需要单例模式,那么它将为您带来好处

通过接口公开该单例的好处是,消费者不需要关心它是如何实现的,只需要它是如何实现的,并且他们可以使用它。在以后的某个日期,如果您突然需要一个常规实例而不是单例实例,您可以在不影响消费者的情况下更改它

这种情况在DI容器中非常常见,您通常可以将绑定的生命周期配置为在单例范围内


如果您直接使用单例,而从未真正使用过接口,那么接口中就没有什么用处了。如果使用单例时不需要将其约束到单个实例,那么采用单例模式就没有什么用处。

请发布一些实时场景的示例代码好吗?没有必要,这将是一个标准的单例实现,碰巧也实现了您的接口。额外的位将使用DI容器或工厂模式返回
IMethods
。请发布一些示例代码实时场景好吗?不需要,这将是一个标准的单例实现,碰巧也实现了您的接口。额外的位将使用DI容器或工厂模式返回
IMethods
。对
实例
属性的访问可以隐藏在
MethodsFactory
后面,后者知道单例,但返回
IMethods
。正如您所说,大多数DI容器通常都会免费提供这些内容。Good point@adamhuldsworth并没有考虑到这一点。不过,它比DI框架更紧密地耦合。与DI框架相比,您要么耦合到
MethodsFactory
,要么耦合到Ninject
kernel.Get()
。所有的东西都可以被平等地抽象,DI只是免费给你额外的东西,而不是穷人的方法。这是真的。我想这取决于你是否正确应用IoC。好吧,正确应用IoC与使用框架无关,因此,我仍然支持这样的评论,即使用框架不会给您带来比您自己更大的松散耦合。对
实例
属性的访问可以隐藏在
方法工厂
后面,该工厂知道单例,但返回
I方法
。正如您所说,大多数DI容器通常都会免费提供这些内容。Good point@adamhuldsworth并没有考虑到这一点。不过,它比DI框架更紧密地耦合。与DI框架相比,您要么耦合到
MethodsFactory
,要么耦合到Ninject
kernel.Get()
。所有的东西都可以被平等地抽象,DI只是免费给你额外的东西,而不是穷人的方法。这是真的。我想这取决于你是否正确地应用了IoC。好吧,正确地应用IoC与使用框架无关,所以我仍然坚持