检查类实例是否已存在
本文关键字:存在 是否 实例 检查 | 更新日期: 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就是你要做的。