Prism使用Options选项

这篇具有很好参考价值的文章主要介绍了Prism使用Options选项。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Options是微软提供的选项模块,该模块依赖于容器使用。除了微软的IServiceCollection,当然也可以使用其它的依赖注入容器。本文演示如何在prism中使用Options。

创建应用项目

创建一个Avalonia应用(或其它类型应用),然后使用NuGet包管理器添加Prism.DryIoc.Avalonia包。创建Views和ViewModels文件夹,将MainWindow移动到Views文件夹中(注意修改namespace),在ViewModels文件夹中创建MainWindowViewModel,以便Prism自动绑定ViewModel。

public partial class App : PrismApplication
{
    public override void Initialize()
    {
        AvaloniaXamlLoader.Load(this);
        base.Initialize();
    }

    protected override AvaloniaObject CreateShell()
    {
        return Container.Resolve<MainWindow>();
    }

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.Register<MainWindow>();
    }
}

添加Options功能

  • 首先使用NuGet添加Microsoft.Extentions.Options和Microsoft.Extensions.Options.ConfigurationExtensions。使用json配置文件进行测试,因此再添加上Microsoft.Extensions.Configuration.Json及Microsoft.Extensions.Configuration.Binder。

  • 添加Options静态类,提供DefaultName:

public static class Options
{
    public static readonly string DefaultName = string.Empty;
    internal const DynamicallyAccessedMemberTypes DynamicallyAccessedMembers =
        DynamicallyAccessedMemberTypes.PublicParameterlessConstructor;
}
  • 由于UnnamedOptionsManager为内部类,无法直接使用,因此添加一个UnnamedOptionsManager类,实现IOptions<>接口,直接拷贝源码即可:
public class UnnamedOptionsManager<[DynamicallyAccessedMembers(Options.DynamicallyAccessedMembers)] TOptions> :
    IOptions<TOptions>
    where TOptions : class
{
    private readonly IOptionsFactory<TOptions> _factory;
    private volatile object _syncObj;
    private volatile TOptions _value;

    public UnnamedOptionsManager(IOptionsFactory<TOptions> factory) => _factory = factory;

    public TOptions Value
    {
        get
        {
            if (_value is TOptions value)
                return value;

            lock (_syncObj ?? Interlocked.CompareExchange(ref _syncObj, new object(), null) ?? _syncObj)
            {
                return _value ??= _factory.Create(Options.DefaultName);
            }
        }
    }
}
  • 添加OptionsPrismExtensions扩展类,添加AddOptions扩展方法,将选项泛型接口、工厂、缓存注册到容器中。工厂注册为瞬时,其它注册为单例。客户端不需要添加IOptionsSnapshot,只添加IOptions<>和IOptionsMonitor<>即可,前者获取选项不会监听修改,后者可以监听选项修改:
public static class OptionsPrismExtensions
{
    public static IContainerExtension AddOptions(this IContainerExtension container)
    {
        ArgumentNullException.ThrowIfNull(container, nameof(container));

        container.RegisterSingleton(typeof(IOptions<>), typeof(UnnamedOptionsManager<>));
        container.RegisterSingleton(typeof(IOptionsMonitor<>), typeof(OptionsMonitor<>));
        container.Register(typeof(IOptionsFactory<>), typeof(OptionsFactory<>));
        container.RegisterSingleton(typeof(IOptionsMonitorCache<>), typeof(OptionsCache<>));
        return container;
    }
}
  • 添加OptionsConfigurationPrismExtensions扩展类,提供Configuration相关的扩展方法,可以直接将选项和配置Section进行绑定:
public static class OptionsConfigurationPrismExtensions
{
    public static IContainerExtension Configure<[DynamicallyAccessedMembers(
        DynamicallyAccessedMemberTypes.All)] TOptions>(this IContainerExtension container, 
        IConfiguration config) where TOptions : class
        => container.Configure<TOptions>(Options.DefaultName, config, _ => { });

    public static IContainerExtension Configure<[DynamicallyAccessedMembers(
        DynamicallyAccessedMemberTypes.All)] TOptions>(this IContainerExtension container, 
        string name, IConfiguration config, Action<BinderOptions> configureBinder)
        where TOptions : class
    {
        ArgumentNullException.ThrowIfNull(container, nameof(container));
        ArgumentNullException.ThrowIfNull(config, nameof(config));
    
        container.AddOptions();
        container.RegisterInstance<IOptionsChangeTokenSource<TOptions>>(
            new ConfigurationChangeTokenSource<TOptions>(name, config));
        container.RegisterInstance<IConfigureOptions<TOptions>>(
            new NamedConfigureFromConfigurationOptions<TOptions>(name, config, configureBinder));
    
        return container;
    }
}

使用

  • 添加一个settings.json配置文件,设置属性复制到输出目录:如果较新则复制:
{
  "Test": {
    "Name": "louzi",
    "Age": 18,
    "Sex": "Male"
  }
}
  • 添加Test对应的Option实体:
public class TestOption
{
    public string Name { get; set; }

    public int Age { get; set; }

    public Gender Sex { get; set; }
}

public enum Gender
{
    Male,
    Female
}
  • 创建IConfiguration并绑定到选项:
// App
protected override IContainerExtension CreateContainerExtension()
{
    var container =  base.CreateContainerExtension();

    IConfiguration config = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("settings.json", optional: true, reloadOnChange: true).Build();
    container.AddOptions().Configure<TestOption>(config.GetSection("Test"));

    return container;
}
  • ViewModel中通过依赖注入获取选项:
public class MainWindowViewModel : BindableBase
{
    private string _name;
    private int _age;
    private Gender _sex;

    public MainWindowViewModel(IOptions<TestOption> options)
    {
        var testOption = options.Value;
        _name = testOption.Name;
        _age = testOption.Age;
        _sex = testOption.Sex;
    }

    public string Name { get => _name; set => SetProperty(ref _name, value); }

    public int Age { get => _age; set => SetProperty(ref _age, value); }

    public Gender Sex { get => _sex; set => SetProperty(ref _sex, value); }
}
  • View中显示
<Grid RowDefinitions="1*,1*,1*" ColumnDefinitions="1*,1*">
	<TextBlock Text="Name: " TextAlignment="Right"/>
	<TextBlock Text="{Binding Name}" Grid.Column="1"/>
	<TextBlock Text="Age: " Grid.Row="1" TextAlignment="Right"/>
	<TextBlock Text="{Binding Age}" Grid.Row="1" Grid.Column="1"/>
	<TextBlock Text="Sex: " Grid.Row="2" TextAlignment="Right"/>
	<TextBlock Text="{Binding Sex}" Grid.Row="2" Grid.Column="1"/>
</Grid>

项目结构及运行效果如下图:
Prism使用Options选项文章来源地址https://www.toymoban.com/news/detail-748603.html

到了这里,关于Prism使用Options选项的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 八、vue_options之computed、watch属性选项

    computed计算属性初体验: 在我们通过Vue调用createApp方法传入一个对象的时候,我们之前写了data属性、methods属性,这一次我们新增一个computed属性,对应的是一个对象,对象里面可以写很多计算属性,fullname是对象里面的key,此时我们需要给他对应一个值,计算属性对应的值是

    2023年04月23日
    浏览(45)
  • CMake入门教程【高级篇】编译选项target_compile_options

    target_compile_options 命令允许用户为特定目标(如可执行文件或库)指定编译器选项,这对于优化构建过程和确保代码兼容性至关重要。

    2024年01月15日
    浏览(41)
  • 免费使用,媲美Midjourney!微软在Bing Chat等提供—DALL-E 3

    微软在官网宣布,将OpenAI最新模型DALL-E 3集成在Bing Chat和Bing Image Create中,并免费提供给用户使用。 据悉,DALL-E 3是一款类Midjourney产品,通过文本就能生成二次元、3D、朋克、涂鸦、素描、黑白、极简、印象派、位面像素等几十种类型图片。例如,生成一个东方巨龙 云雾缭绕

    2024年02月08日
    浏览(45)
  • 使用微软提供的工具获取权限删除不能直接删除的注册表(删除U盘等移动设备记录)

    在计算机HKEY_LOCAL_MACHINESYSTEMControlSet001EnumUSBSTOR中保存了电脑连接过的移动设备信息,但是直接右键无法删除项目 在网上搜索资料后发现微软有发布工具可以进行删除操作,但是需要输入命令,于是,我使用C#进行简单的封装 该代码执行后,使用psexec.exe打开注册表并可以删

    2024年02月16日
    浏览(37)
  • win10退出登录微软账号,亲测有效可以成功(解决没有改用本地账户;解决没有删除选项)

    1、windows+R   运行输入regedit 2. 打开注册表编辑器之后找到:HKEY_CURRENT_USERSoftwareMicrosoftIdentityCRLUserExtendedProperties***@**.com (这里***@**.com是你的账户名) 选中“***@**.com”文件删除; 3.找到: HKEY_USERS.DEFAULTSoftwareMicrosoftIdentityCRLStoredIdentities***@**.com (这里***@**.com是你的账户名

    2024年02月11日
    浏览(54)
  • git中cherry-pick报错是一个合并提交但未提供-m选项的解决方法

    在 new_feature 分支上,想 cherry-pick 一下另一个分支上的提交,不想发生如下错误: 在原始的命令后面加上 -m 1 即可:

    2024年02月15日
    浏览(45)
  • 微软允许OEM对Win10不提供关闭Secure Boot

    用户可能将无法在Windows 10电脑上安装其它操作系统了,微软不再要求OEM在UEFI 中提供的“关闭 Secure Boot”的选项。 微软最早是在Designed for Windows 8认证时要求OEM的产品必须支持UEFI Secure Boot。Secure Boot 被设计用来防止恶意程序悄悄潜入到引导进程。问题是如果其它的操作系统,

    2024年02月03日
    浏览(39)
  • 文字转语音 - 搭建微软tts整合web服务提供api接口(免费)

    微软tts是业界公认文字转语音效果最佳 本文使用docker搭建微软tts服务并提供api接口对外提供服务 对接官方免费在线体验接口,搭建后可免费进行调用使用,不保证永久稳定可用 url :http://127.0.0.1:5003/tts method :POST 参数 类型 描述 text string 语音文字内容 voiceName string 发音人(

    2024年02月11日
    浏览(45)
  • libcurl是一个用于进行网络通信的开源库,提供了各种功能和选项,可以用于发送和接收HTTP请求、FTP操作等

    libcurl是一个用于进行网络通信的开源库,提供了各种功能和选项,可以用于发送和接收HTTP请求、FTP操作、SMTP邮件等。它支持多种协议,包括HTTP、HTTPS、FTP、FTPS、SMTP、POP3、IMAP等。 以下是libcurl库的一些特点和功能: 跨平台:libcurl可在多个操作系统上使用,包括Windows、Lin

    2024年01月19日
    浏览(50)
  • WPF Prism的简单使用

    新建 WPF 项目,我是基于 .net 5.0-windows 创建的。 引入 Prism.DryIoc(8.1.97) 的 Nuget 包。 App.xaml 中引入命名空间。 将 App.xaml 中 Application 标签更改成 prism:PrismApplication 并去除 StartUri 属性,将 App.xaml.cs 中 Application 更改成 PrismApplication 。 实现 PrismApplication (实际上是 PrismApplicationBas

    2023年04月14日
    浏览(76)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包