是否可以在接口中包装C#单例?
我目前有一个类,我只有静态成员和常量,但我想用一个包装在界面中的单例替换它。
但是我怎么能这样做,记住我见过的每个单例实现都有一个静态实例方法,从而破坏了接口规则?
要考虑(而不是自己动手)的解决方案是利用IoC容器,例如Unity 。
IoC容器通常支持针对接口注册实例。 这提供了您的单例行为,因为客户端解析接口将接收单个实例。
//Register instance at some starting point in your application container.RegisterInstance(new ActiveSessionService()); //This single instance can then be resolved by clients directly, but usually it //will be automatically resolved as a dependency when you resolve other types. IActiveSessionService session = container.Resolve ();
您还可以获得额外的优势,即可以轻松地改变单例的实现,因为它是在接口上注册的。 这对于生产很有用,但对于测试来说可能更有用。 真正的单身人士在测试环境中会非常痛苦。
您无法使用接口执行此操作,因为它们仅指定实例方法,但您可以将其放在基类中。
单例基类:
public abstract class Singleton where ClassType : new() { static Singleton() { } private static readonly ClassType instance = new ClassType(); public static ClassType Instance { get { return instance; } } }
儿童单身人士:
class Example : Singleton { public int ExampleProperty { get; set; } }
来电者:
public void LameExampleMethod() { Example.Instance.ExampleProperty++; }
您可以使单例的所有其他成员在接口中实现相应的成员。 但是,您是正确的, Instance
属性不能是接口的一部分,因为它是(并且必须保持)静态。
接口不能在C#中有实例,我想你只需要:
实现单例模式(是的,你需要一个静态属性或方法来获取实例,但其他一切都不需要是静态的)
另一方面,您的单例可以根据需要实现接口,只需记住其他类也可以实现相同的接口