检查类实例是否已存在

本文关键字:存在 是否 实例 检查 | 更新日期: 2023-09-27 18:25:00

我想知道我们是否可以显式地编写代码,以便知道该类的实例是否已经可用,如果该实例可用,我们可以处理它,然后可以创建该类的新实例我在WPF和Prism做一个项目,对它的了解非常有限。如有任何帮助,我们将不胜感激。

public class BillingSectionModule : IModule
{
    private IRegionManager _regionManager;
    private IUnityContainer _unityContainer;
    public BillingSectionModule(IRegionManager regionManager, IUnityContainer unityContainer)
    {
        this._regionManager = regionManager;
        this._unityContainer = unityContainer;
    }
    #region IModule Members
    public void Initialize()
    {
        _unityContainer.RegisterType<IBillingSectionViewModel, BillingSectionViewModel>();
        _unityContainer.RegisterType<IBillingSectionView, BillingSectionView>();
        _unityContainer.RegisterType<IBillingSectionAdvanceBillingViewModel, BillingSectionAdvanceBillingViewModel>();
        _unityContainer.RegisterType<IBillingSectionAdvanceBillingView, BillingSectionAdvanceBillingView>();
        _regionManager.RegisterViewWithRegion(RegionNames.BillingOptionRegion, typeof(IBillingSectionView));
    }
    #endregion
}

这是我写的模块类。。。正如您所看到的,有两个视图与单个模块相关联。所以当

public void ChangeToAdvanceRegion(IRegionManager regionManager, IUnityContainer unityContainer)
{

    //change Billing Area
    var BillingAreaview = ServiceLocator.Current.GetInstance<IBillingSectionAdvanceView>();
    if (!regionManager.Regions[RegionNames.BillingOptionRegion].Views.Contains(BillingAreaview))
        regionManager.Regions[RegionNames.BillingOptionRegion].Add(BillingAreaview);
    regionManager.Regions[RegionNames.BillingOptionRegion].Activate(BillingAreaview);

    //reset the values
    _eventAggregator.GetEvent<NewItemOrderEvent>().Publish("CHANGEADVANCEITEMFROMREGION");
}
public void ChangeToNewOrderRegion(IRegionManager regionManager, IUnityContainer unityContainer)
{
    //change Billing Area
    var BillingAreaview = ServiceLocator.Current.GetInstance<IBillingSectionView>();
    if (!regionManager.Regions[RegionNames.BillingOptionRegion].Views.Contains(BillingAreaview))
        regionManager.Regions[RegionNames.BillingOptionRegion].Add(BillingAreaview);
    regionManager.Regions[RegionNames.BillingOptionRegion].Activate(BillingAreaview);

    //reset the values
    _eventAggregator.GetEvent<NewItemOrderEvent>().Publish("CHANGENEWITEMFROMREGION");
}

所以当我先调用上面的函数,然后调用第二个函数时。。先前创建的视图模型实例未被释放。。但一个新的。。。所以当我第n次打电话的时候。。视图模型内部的功能在鼓室中执行。在应用程序中创建负载问题。。。。

检查类实例是否已存在

您正在寻找的被称为Singleton模式。这里有很多关于它的信息。为了简单起见,我们将使用该页面上的第一个示例。

对于singleton,应用程序中只有给定对象的一个实例。因此,根据您的需求,您可以简单地销毁该实例并用新实例替换它。例如:

public sealed class Singleton
{
    private static Singleton instance=null;
    private Singleton()
    {
    }
    public static Singleton Instance
    {
        get
        {
            instance = new Singleton();
            return instance;
        }
    }
}

当然,不清楚的是为什么要这样做。考虑一下它重构为什么:

public sealed class Singleton
{
    private Singleton()
    {
    }
    public static Singleton Instance
    {
        get
        {
            return new Singleton();
        }
    }
}

在这一点上,您甚至没有跟踪一个singleton,您只是在任何时候请求创建一个新的singleton。那么,为什么要这么做呢?您可以将此简化为:

new Singleton();

因此,还不清楚为什么要这样做,但如果你想跟踪应用程序范围内对象的单个实例,那么Singleton就是你要做的。