2014-09-29 71 views
0

我想知道我们是否可以显式编写代码以便知道该类的实例是否已经可用,并且如果实例可用,我们可以将其丢弃,然后新实例的类可以创建 我正在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次时,视图模型内部的函数被执行n tyms。在应用程序中创建加载问题....

+3

您是否指单例模式? http://csharpindepth.com/articles/general/singleton.aspx – David 2014-09-29 13:01:01

+0

@大卫Singleton模式只是保持相同的实例吗? – 2014-09-29 13:09:28

+0

我想每次都有一个新的实例,但想要处理已经创建的实例 – 2014-09-29 13:10:02

回答

2

你在找什么叫做Singleton模式。有很多关于它的信息here。为了简单起见,我们将使用该页面上的第一个示例。

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

public sealed class Singleton 
{ 
    private static Singleton instance=null; 

    private Singleton() 
    { 
    } 

    public static Singleton Instance 
    { 
     get 
     { 
      instance = new Singleton(); 
      return instance; 
     } 
    } 
} 

当然,什么是清楚的是为什么你想这样做。考虑一下这个refactors到:

public sealed class Singleton 
{ 
    private Singleton() 
    { 
    } 

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

在这一点上,你甚至不跟踪一个单身,你只需创建一个新的它要求的任何时间。那么,为什么要摆在首位呢?你可以简单地这甚至还用于:

new Singleton(); 

所以它不是真正清楚为什么要做到这一点,但如果你想要的是一个应用程序的范围内跟踪对象的单个实例,然后一个单身人士是你如何做到这一点。

相关问题