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