检查类实例是否已存在

时间:2014-09-29 12:57:18

标签: c# wpf prism

我想知道我们是否可以显式编写代码以便知道类的实例是否已经可用,如果实例可用,我们可以处理它,然后可以创建类的新实例 我正在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");
}

所以,当我首先调用上面的functin然后第二个调用时...之前创建的视图模型实例没有被处理..但是创建了一个新的... 所以当我第n次调用时...视图模型中的函数是在tyms中执行的。在应用程序中创建负载问题....

1 个答案:

答案 0 :(得分:2)

您正在寻找的是Singleton Pattern。它上面有很多信息here。为简单起见,我们将使用该页面上的第一个示例。

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

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

此时你甚至没有跟踪单身人士,你只需要在任何时候创建一个新单身人士。那么为什么这首先呢?您可以更进一步:

new Singleton();

因此,为什么要执行此操作并不是很清楚,但如果您想要的是跟踪应用程序范围内的对象的单个实例,那么Singleton就是这样做的