C# 从标准库播放MediaPlayer
从.netstandard2.1库中,我没有访问MediaPlayer类的权限。 当某个方法中发生事件时,来自该库的服务应播放mp3文件 我的主要项目是一个.NET5 WPF,当在内部单独测试它时,这个小代码工作得非常好:C# 从标准库播放MediaPlayer,c#,wpf,class-library,.net-5,C#,Wpf,Class Library,.net 5,从.netstandard2.1库中,我没有访问MediaPlayer类的权限。 当某个方法中发生事件时,来自该库的服务应播放mp3文件 我的主要项目是一个.NET5 WPF,当在内部单独测试它时,这个小代码工作得非常好: private void PlayAlert() { MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.Open(new Uri("alert.mp3", UriKind.Re
private void PlayAlert()
{
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.Open(new Uri("alert.mp3", UriKind.Relative));
mediaPlayer.Play();
}
如何将我的lib与这个只在这里工作的私有方法很好地连接起来
谢谢 您可以在类库中创建一个
ISoundPlayer
接口,在需要的任何地方,将其作为依赖项传递给类的构造函数
然后在您的Wpf应用程序中,在MySoundPlayer类中实现该接口,并且每当您想要实例化类库中依赖于ISoundPlayer的类之一时,将MySoundPlayer传递给它们
还有一些其他可能的解决方案,如果你有兴趣了解它们,请阅读答案底部关于控制反转的注释
示例
下面的示例不使用任何DI框架,而是创建了一个类库,其中包含一个MyClass,该MyClass依赖于一个名为ISoundPlayer的接口。然后在另一个项目中,一个Wpf应用程序实现ISoundPlayer,实例化MyClass并将ISoundPlayer的实现传递给它。您可以使用DI库(不在本q/a的范围内)使用相同的功能
遵循以下步骤:
ISoundPlayer
接口添加到类库:
namespace MyClassLibrary
{
public interface ISoundPlayer
{
void PlaySound();
}
}
using System;
namespace MyClassLibrary
{
public class MyCLass
{
ISoundPlayer soundPlayer;
public MyCLass(ISoundPlayer soundPlayer)
{
this.soundPlayer = soundPlayer ??
throw new ArgumentNullException(nameof(soundPlayer));
}
public void DoSomething()
{
//Do something
soundPlayer.PlaySound();
}
}
}
using MyClassLibrary;
using System;
using System.Windows.Media;
namespace MyWpfApp
{
public class MySoundPlayer : ISoundPlayer
{
public void PlaySound()
{
//var player = new MediaPlayer();
//player.Open(new Uri("alert.mp3"));
//player.Play();
//or simply
System.Media.SystemSounds.Beep.Play();
}
}
}
private void button_Click(object sender, RoutedEventArgs e)
{
var myClass = new MyClassLibrary.MyCLass(new MySoundPlayer());
myClass.DoSomething();
}
- 依赖项注入:您可以依赖具有PlaySoundPlayer方法的ISoundPlayer接口,并将此依赖项注入库中
- 事件:您可以在库中发起事件,让消费者订阅事件并播放声音
- 委托:您可能希望插入委托(作为属性或通过构造函数),并在库中使用该委托
DoSomething
的方法,这些方法在某个时间点运行。