提升错误,处置对象并重新创建它

时间:2016-03-01 20:40:18

标签: c# .net events

假设我们有以下两个类,我们如何监听错误,如果发生任何错误,重新创建单例?我已经汇总了以下代码,但是想知道是否存在安全引发错误的模式,处置对象并自动重新创建它?

`

    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);


    }
}

`

1 个答案:

答案 0 :(得分:2)

如果我理解得很好,MyFirstClass(这是一个单身人士)就是MySecondClass的一种包装,它也会将MySecondClass变为单身。

我们致电MyFirstClassWrapper

我们致电MySecondClassService

如果客户端始终通过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();

注意:处置服务会使对象无效,并使客户端对其的任何引用无效。但重新创建一个新的并没有给客户一个新的参考!您需要具有对客户端引用的引用,以便能够为客户端提供新实例。