iT邦幫忙

0

(WPF NET6) API 跟 ViewModel物件DI問題

  • 分享至 

  • xImage

使用WPF NET6 Caliburn.Micro MVVM框架
我現在有寫一個Api
目前是打算做 用內網call api 可以去強制撥放緊急音效
問題 現在api call Emergency後 會撥放
但是會在創建一次MainViewModel 所以會造成 MainViewModel內原本在撥放的音效
會一起撥放 而不是蓋掉原本的MainViewModel內的音效

目前有點類似 call api 變成兩台撥放器 兩台各自撥放 如果多call 就變更多台
需求是想要 call api 由原本那台撥放器不管撥放甚麼都變成撥放緊急音效

想問一下是我DI的設定有問題嗎 還是有其他的方式可以處理

bootstrap部分

public partial class Bootstrapper : BootstrapperBase
{
    private readonly SimpleContainer _container = new SimpleContainer();
    public Bootstrapper()
    {
        Initialize();
    }
    protected override void Configure()
    {
        _container.Singleton<MainViewModel>();
        _container.Singleton<ApiController>();
        _container.Singleton<HomeViewModel>();
    }

    protected override void OnStartup(object sender, StartupEventArgs e)
    {
        DisplayRootViewForAsync<LoginViewModel>();
    }
}

Api部分

[ApiController]
public class ApiController : ControllerBase
{
    [Route("api/Emergency")]
    [HttpGet]
    public string Emergency()
    {
        MainViewModel MainViewModel = IoC.Get<MainViewModel>();
        MainViewModel.Play(true);
        return "success";
    }
}

MainViewModel部分

public MainViewModel()
{
//init
}
public async Task Play(bool IsEmergency = false)
{
    Wave.play()
}
ntustzeus iT邦新手 3 級 ‧ 2023-04-20 09:08:20 檢舉
為什麼MainViewModel 要多次創建?一般應該在建構子裡執行一次DataContext = new MainViewModel();就好了
然後在xaml裡設定binding
柯柯 iT邦新手 3 級 ‧ 2023-04-21 11:37:19 檢舉
後來查完資料後發現
API Controller的這行
MainViewModel MainViewModel = IoC.Get<MainViewModel>();
因為HTTP的關係 所以他會在創建一次物件 所以DI的方式無效
現在改成用資料庫去存欄位 然後MainViewModel
用timer 去監聽欄位的值改變再撥放了
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友回答

立即登入回答