如何为应用程序设置单个对象实例?

How to set up a single object instance for an application?

我正在为我的应用程序遵循 MVVM 模式,为了防止内存泄漏,我需要将对象实例的数量减少到一个。然后应在需要时将此对象实例交给另一个 类。

在我当前的实现中,实例正在 AppVM 中设置,并传递给 AdductionAbductionFlexionViewModel。但是通过搜索 MyoDeviceModle() 实例,第二个实例显示在 AdductionAbductionFlexionView.

我的问题是如何在 AdductionAbductionFlexionView 中设置构造函数以获取在整个应用程序中使用的 _connectedDevice 实例?

这是显示应该使用的主要且唯一实例的 AppVM:

private MyoDeviceModel _connectedDevice;

        #endregion

        /// <summary>
        /// Initializes a new instance of the <see cref="ApplicationViewModel"/> class.
        /// </summary>
        public ApplicationViewModel()
        {
            _connectedDevice = new MyoDeviceModel();
            // Add available pages
            PageViewModels.Add(new HomeViewModel(new UserLoginModel()));
            PageViewModels.Add(new AdductionAbductionFlexionViewModel(_connectedDevice, new DatabaseModel()));


            // Set starting page
            CurrentPageViewModel = PageViewModels[0];
        }

这就是它传递给 AdductionAbductionFlexionViewModel 的方式:

私有 MyoDeviceModel _myoDevice; 私有数据库模型_dataObj;

public event Action<string> DataChanged;

private string _itemString;


/// <summary>
/// Initializes a new instance of the <see cref="AdductionAbductionFlexionViewModel"/> class.
/// </summary>
/// <param name="Myodevice">The device.</param>
/// <param name="progressData">The progress data.</param>
public AdductionAbductionFlexionViewModel(MyoDeviceModel Myodevice, DatabaseModel progressData)
{

    DataSubmitCommand = new RelayCommand (this.SaveChangesToPersistence);
    CalibrationSetCommand = new RelayCommand(this.CallibratePitchMinimumCall);
    DatabaseSearchCommand = new RelayCommand(this.QueryDataFromPersistence);

    _myoDevice = Myodevice;
    _myoDevice.MyoDeviceStart();

    _dataObj = progressData;

    _myoDevice.StatusUpdated += (update) =>
    {
        CurrentStatus = update;   
    };


    _myoDevice.PoseUpdated += (update) =>
    {
        PoseStatus = update;   
    };


    _myoDevice.PainfulArcDegreeUpdated += (update) =>
    {
        PainfulArcStatus = update;
    };


    _myoDevice.DegreesUpdated += (update) =>
    {
        DegreeStatus = update;
    };

    _myoDevice.StartDegreeUpdated += (update) =>
    {
        StartDegreeStatus = update;    
    };

    _myoDevice.EndDegreeUpdated += (update) =>
    {
        EndDegreeStatus = update;    
    };


}

但我想知道如何传递 _connectedDevice 实例而不是 new MyoDeviceModel()

        public AdductionAbductionFlexionView()
        {
            InitializeComponent();
            this.DataContext = new AdductionAbductionFlexionViewModel(new MyoDeviceModel(), new DatabaseModel()); 
            this.Loaded += AdductionAbductionFlexionView_Loaded;
            this.Loaded -= AdductionAbductionFlexionView_Loaded;

            ((AdductionAbductionFlexionViewModel)DataContext).DataChanged += x =>
            {

                new ToastPopUp("Submit Succeeded!", "Progress data submitted succesfully", NotificationType.Information)
                {
                    Background = new LinearGradientBrush(System.Windows.Media.Color.FromRgb(0, 189, 222), System.Windows.Media.Color.FromArgb(255, 10, 13, 248), 90),
                    BorderBrush = new SolidColorBrush(System.Windows.Media.Color.FromRgb(0, 189, 222)),
                    FontColor = new SolidColorBrush(System.Windows.Media.Color.FromRgb(255, 255, 255))
                }.Show();

            };

        }

您正在将初始实例传递给另一个 class 的构造函数。因此,您只使用一个实例而不是两个。如果您不想传递实例,则需要考虑实现 Singleton Pattern.