假设我们有以下两个类,我们如何监听错误,如果发生任何错误,重新创建单例?我已经汇总了以下代码,但是想知道是否存在安全引发错误的模式,处置对象并自动重新创建它?
`
static void Main(string[] args)
{
MyFirstClass.Instance.SayHello();
}
}
class MySecondClass
{
public int ID { get; set; }
public void SayHelloFromSecondClass()
{
Console.WriteLine("Say Hello From Second Class");
}
public MySecondClass(int id)
{
ID = id;
}
}
public sealed class MyFirstClass
{
private static readonly MyFirstClass instance = new MyFirstClass();
private static MySecondClass msc;
public event EventHandler ErrorOccuredEvent;
private MyFirstClass() { }
public static MyFirstClass Instance
{
get
{
msc = new MySecondClass(id: 1);
return instance;
}
}
public void SayHello()
{
Console.WriteLine("Hello World...");
}
static void ErrorOccured(object sender, EventArgs e)
{
Console.WriteLine("Oops");
msc = null;
Thread.Sleep(5000);
GC.Collect();
msc = new MySecondClass(id: 2);
}
}
`
答案 0 :(得分:2)
如果我理解得很好,MyFirstClass
(这是一个单身人士)就是MySecondClass
的一种包装,它也会将MySecondClass
变为单身。
我们致电MyFirstClass
:Wrapper
我们致电MySecondClass
:Service
如果客户端始终通过Service
的单个实例使用Wrapper
,则重新创建Wrapper
将无济于事,因为客户端可能会保留对{{1}的引用}}。如果客户端没有看到它并且无法保留对它的引用,则重新创建Wapper
会有所帮助。因此,他们必须间接消费这项服务。
通过界面实现这一目标最为简单:
Service
但是如果在客户端使用服务时发生错误......
public interface IHelloService
{
void SayHello();
}
public class HelloService : IHelloService
{
public void SayHello()
{
Console.WriteLine("Hello");
}
}
public class HelloServiceWrapper : IHelloService
{
public static readonly IHelloService Instance = new HelloServiceWrapper();
private HelloServiceWrapper () {}
private IHelloService _service;
public void SayHello()
{
EnsureServiceAvailable();
_service.SayHello();
}
private void EnsureServiceAvailable()
{
if(_service == null) {
_service = new HelloService();
}
}
private void HandleError()
{
_service = null;
}
}
......这个电话可能会失败。
您必须立即重新创建服务才能使客户的呼叫成功(假设重新创建服务将解决问题并且错误不会立即再次发生):
HelloServiceWrapper.Instace.SayHello();
注意:处置服务会使对象无效,并使客户端对其的任何引用无效。但重新创建一个新的并没有给客户一个新的参考!您需要具有对客户端引用的引用,以便能够为客户端提供新实例。