从标准库播放 MediaPlayer
Playing MediaPlayer from standard lib
在我的 .NETStandard 2.1 库中,我无法访问 MediaPlayer class。
当其中一种方法发生事件时,来自同一库的服务应播放 mp3 文件
我的主要项目是 .NET5 WPF,这段小代码在内部单独测试时效果很好:
private void PlayAlert()
{
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.Open(new Uri("alert.mp3", UriKind.Relative));
mediaPlayer.Play();
}
您将如何干净利落地将我的库与仅适用于此的私有方法连接起来?
谢谢!
您可以在 class 库中创建一个 ISoundPlayer
接口,在任何需要的地方,将其作为依赖项传递给 class.
的构造函数
然后在您的 Wpf 应用程序中,在 MySoundPlayer class 中实现该接口,并且每当您想要实例化 class 库的那些 classes 之一时,它依赖于ISoundPlayer,把MySoundPlayer传给他们
还有一些其他可能的解决方案,如果您有兴趣了解它们,请阅读关于控制反转的答案底部的注释。
例子
以下示例不使用任何 DI 框架,但创建了一个 class 库,其中有一个 MyClass,它依赖于一个名为 ISoundPlayer 的接口。然后在另一个项目中,一个 Wpf 应用程序,实现 ISoundPlayer,实例化 MyClass 并将 ISoundPlayer 的实现传递给它。您可以使用 DI 库(这超出了本 q/a 的范围)。
按照以下步骤操作:
创建 WPF 应用程序 MyWpfApp
创建 .NET 标准 class 库项目,MyClassLibrary
向您的 class 库添加一个 ISoundPlayer
接口:
namespace MyClassLibrary
{
public interface ISoundPlayer
{
void PlaySound();
}
}
在构造函数中添加一个class获取ISoundPlayer接口:
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();
}
}
}
将 MyClassLibrary 的引用添加到您的 MyWpfApp。
创建一个 MySoundPlayer class 实现 ISoundPlayerInterface:
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();
}
}
}
在 main window 上放置一个按钮并处理其点击事件,实例化 MyClass 并将 MySoundPlayer 的实例传递给它。
private void button_Click(object sender, RoutedEventArgs e)
{
var myClass = new MyClassLibrary.MyCLass(new MySoundPlayer());
myClass.DoSomething();
}
备注
要达到Inversion of Control可以考虑以下方案:
- 依赖注入:您可以依赖具有 PlaySound 方法的 ISoundPlayer 接口并将此依赖项注入您的库。
- 事件:您可以在您的库中发起一个事件,让消费者订阅该事件并播放声音。
- 委托:您可能想要注入一个委托(作为 属性 或通过构造函数)并在您的库中使用该委托。
在我的 .NETStandard 2.1 库中,我无法访问 MediaPlayer class。 当其中一种方法发生事件时,来自同一库的服务应播放 mp3 文件
我的主要项目是 .NET5 WPF,这段小代码在内部单独测试时效果很好:
private void PlayAlert()
{
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.Open(new Uri("alert.mp3", UriKind.Relative));
mediaPlayer.Play();
}
您将如何干净利落地将我的库与仅适用于此的私有方法连接起来?
谢谢!
您可以在 class 库中创建一个 ISoundPlayer
接口,在任何需要的地方,将其作为依赖项传递给 class.
然后在您的 Wpf 应用程序中,在 MySoundPlayer class 中实现该接口,并且每当您想要实例化 class 库的那些 classes 之一时,它依赖于ISoundPlayer,把MySoundPlayer传给他们
还有一些其他可能的解决方案,如果您有兴趣了解它们,请阅读关于控制反转的答案底部的注释。
例子
以下示例不使用任何 DI 框架,但创建了一个 class 库,其中有一个 MyClass,它依赖于一个名为 ISoundPlayer 的接口。然后在另一个项目中,一个 Wpf 应用程序,实现 ISoundPlayer,实例化 MyClass 并将 ISoundPlayer 的实现传递给它。您可以使用 DI 库(这超出了本 q/a 的范围)。
按照以下步骤操作:
创建 WPF 应用程序 MyWpfApp
创建 .NET 标准 class 库项目,MyClassLibrary
向您的 class 库添加一个
ISoundPlayer
接口:namespace MyClassLibrary { public interface ISoundPlayer { void PlaySound(); } }
在构造函数中添加一个class获取ISoundPlayer接口:
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(); } } }
将 MyClassLibrary 的引用添加到您的 MyWpfApp。
创建一个 MySoundPlayer class 实现 ISoundPlayerInterface:
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(); } } }
在 main window 上放置一个按钮并处理其点击事件,实例化 MyClass 并将 MySoundPlayer 的实例传递给它。
private void button_Click(object sender, RoutedEventArgs e) { var myClass = new MyClassLibrary.MyCLass(new MySoundPlayer()); myClass.DoSomething(); }
备注
要达到Inversion of Control可以考虑以下方案:
- 依赖注入:您可以依赖具有 PlaySound 方法的 ISoundPlayer 接口并将此依赖项注入您的库。
- 事件:您可以在您的库中发起一个事件,让消费者订阅该事件并播放声音。
- 委托:您可能想要注入一个委托(作为 属性 或通过构造函数)并在您的库中使用该委托。