首页 > 其他分享 >Avalonia集成Prism与Abp

Avalonia集成Prism与Abp

时间:2023-03-05 23:11:44浏览次数:48  
标签:collection Abp Prism static new logger configuration public Avalonia

Wpf中使用appsettings.json配置文件以及UserSecrets

通过ConfigurationBuilder读取配置信息

var builder = new ConfigurationBuilder()
    .SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
    .AddUserSecrets(typeof(App).Assembly);

Configuration.DefaultNameOrConnectionString = builder.Build().GetConnectionString("Default");

添加UserSecrets启动项csproj文件PropertyGroup节点中会多出如下配置

<UserSecretsId>2f1ac190-35e0-4261-828d-f28c3b746de9</UserSecretsId>

集成Abp以及Serilog

本示例中使用abp版本7.3.0

var services = new ServiceCollection();
            services.CreateSeriLog(builder.Build())
                .UseSeriLog(SerilogCreatorExtensions.logger);
            IocManager.IocContainer.AddFacility<LoggingFacility>(f => f.LogUsing(new SerilogFactory(SerilogCreatorExtensions.logger)));

WindsorRegistrationHelper.CreateServiceProvider(IocManager.IocContainer, services);

使用到EF部分需要记录日志将IOC中SerilogFactory替换原有Microsoft.Extensions.Logging.ILoggerFactory

        Configuration.Modules.AbpEfCore().AddDbContext<PlatformDbContext>(options =>
        {
#if DEBUG
            var loggerFactory = IocManager.IocContainer.Resolve<ILoggerFactory>();
                options.DbContextOptions.UseLoggerFactory(loggerFactory);
                options.DbContextOptions.EnableSensitiveDataLogging(); // 记录SQL的参数值
#endif
            //...
        });

SerilogCreatorExtensions

public static class SerilogCreatorExtensions
{
    public static Serilog.ILogger logger;
    public static Serilog.Core.Logger CreateSerilog(this IConfigurationRoot configuration)
    {
        return BuildSerilogConfiguration(configuration).CreateLogger();
    }
    private static LoggerConfiguration BuildSerilogConfiguration(IConfiguration configuration)
    {
        // 默认读取 configuration 中 "Serilog" 节点下的配置
        var loggerConfiguration = new LoggerConfiguration();
        SetSerilogConfiguration(loggerConfiguration, configuration);
        return loggerConfiguration;
    }
    public static void SetSerilogConfiguration(LoggerConfiguration loggerConfiguration, IConfiguration configuration)
    {
        // 默认读取 configuration 中 "Serilog" 节点下的配置
        loggerConfiguration.ReadFrom.Configuration(configuration)
            .Enrich.WithExceptionDetails()
            .Enrich.WithExceptionDetails(new DestructuringOptionsBuilder()
                .WithDefaultDestructurers()
                .WithDestructurers(new[] { new DbUpdateExceptionDestructurer() })
            )
            .Enrich.FromLogContext()
            .MinimumLevel.Debug()//最小记录级别
            .WriteTo.Console();
        var logPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"Logs", "logs.txt");
        loggerConfiguration.WriteTo.File(logPath, rollingInterval: RollingInterval.Day, shared: true);
    }
    public static IServiceCollection CreateSeriLog(this IServiceCollection collection, IConfigurationRoot configuration)
    {
        if (logger == null)
        {
            logger = BuildSerilogConfiguration(configuration).CreateLogger();
        }
        return collection;
    }

    public static IServiceCollection UseSeriLog(this IServiceCollection collection, Serilog.ILogger logger = null,
        bool dispose = false, LoggerProviderCollection providers = null)
    {
        if (providers != null)
        {
            collection.AddSingleton<ILoggerFactory>(services =>
            {
                var factory = new SerilogLoggerFactory(logger, dispose, providers);

                foreach (var provider in services.GetServices<ILoggerProvider>())
                    factory.AddProvider(provider);

                return factory;
            });
        }
        else
        {
            collection.AddSingleton<ILoggerFactory>(services => new SerilogLoggerFactory(logger, dispose));
        }
        ConfigureServices(collection, logger);

        return collection;
    }

    static void ConfigureServices(IServiceCollection collection, Serilog.ILogger logger)
    {
        if (collection == null) throw new ArgumentNullException(nameof(collection));

        if (logger != null)
        {
            collection.AddSingleton(logger);
        }
    }
}

appsettings.json配置

{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "Microsoft": "Information",
        "System": "Information"
      }
    }
  },
  "ConnectionStrings": {
    "Default": "Data Source=192.168.1.1;Database=avawpf;uid=root;pwd=root;charset=utf8mb4;Allow User Variables=true;"
  }
}

Abp模块加载

protected void OnStartup()
{
    Stopwatch watch = new Stopwatch();
    watch.Start();
    //var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"\xx-path");
    //_bootstrapper.PlugInSources.AddFolder(path);
    _bootstrapper.Initialize();
    watch.Stop();
    TimeSpan timeSpan = watch.Elapsed;
    Console.WriteLine("执行时间:{0}(毫秒)", timeSpan.TotalMilliseconds);
}

加载耗时

ViewModel中调用AppService

本来是打算弄一个Prism.CastleWindsor扩展就能统一IOC容器,但是使用后有些prism的Factory相关类型注入存在问题(纯属本人对Castle.Windsor使用上没有弄透彻)

最后暂时通过IocManager获取IOC实例,由于Prims(Prism.DryIoc.Avalonia)与Abp(Castle.Windsor)中使用IOC不一样故使用如下方式。

private readonly ITodoItemAppService _todoItemAppService = IocManager.Instance.Resolve<ITodoItemAppService>();

如果需要使用job也可以借助Quartz事先

集成Prism

Prism.Avalonia
基本和原先prism使用基本上没什么区别

App.xaml.cs

public class App : PrismApplication
{
    public static bool IsSingleViewLifetime =>
        Environment.GetCommandLineArgs()
            .Any(a => a == "--fbdev" || a == "--drm");

    public static AppBuilder BuildAvaloniaApp() =>
        AppBuilder
            .Configure<App>()
            .UsePlatformDetect();

    public override void Initialize()
    {
        AvaloniaXamlLoader.Load(this);
        base.Initialize();              // <-- Required
    }

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        // Register Services
        // Views - Generic
        // Views - Region Navigation
    }

    protected override AvaloniaObject CreateShell()
    {
        if (IsSingleViewLifetime)
            return Container.Resolve<MainControl>(); // For Linux Framebuffer or DRM
        else
            return Container.Resolve<MainWindow>();
    }

    protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
    {
        // Register modules
    }

    /// <summary>Called after <seealso cref="Initialize"/>.</summary>
    protected override void OnInitialized()
    {
      // Register initial Views to Region.
    }
}

使用到到UI皮肤

Material.Avalonia具体内容可以点进去看

效果

整理后会放github

标签:collection,Abp,Prism,static,new,logger,configuration,public,Avalonia
From: https://www.cnblogs.com/ddrsql/p/17181967.html

相关文章

  • 【Avalonia】【跨平台】关于Prism项目模块化在Linux下路径问题
    背景当我们在用Avalonia开发项目的时候会涉及到路径的问题,在Linux下面路径的写法和Window路径的写法有区别问题描述用Avalonia开发项目发现我们之前的路径写法在Linux下......
  • ABP微服务系列学习-对接前端界面
    前面我们把后端的微服务架子基本搭建完成并成功启动了,现在我们可以对接前端界面了。这里我们直接用ABP模板里面的Angular的前端界面。创建应用程序模板使用ABPCli创建一......
  • ABP微服务系列学习-使用Tye启动微服务
    Tye是微软开源的一款开发人员工具,能够用于简化微服务以及分布式应用程序的开发、测试以及部署过程。Tye的首要目标是简化微服务的开发,具体方式包括仅用一行命令执行多项......
  • ABP微服务系列学习-搭建自己的微服务结构(四)
    上篇我们实现了认证服务和网关服务,基本我们的基础服务已经完成了,接下来我们才需要做服务的数据迁移。这里我们需要使用EF的CodeFirst模式。通过DotnetCli的命令去操作:dotn......
  • Avalonia使用默认弹窗
    Avalonia使用默认弹窗在Avalonia中使用官方默认弹窗WindowNotificationManagerViews\MainWindow.axaml相关代码<Windowxmlns="https://github.com/avaloniaui"......
  • ABP微服务系列学习-搭建自己的微服务结构(三)
    上一篇我们基础服务初步搭建完毕,接下来我们整一下认证和网关。搭建认证服务认证服务的话,ABPCLI生成的所有模板都包括了一个AuthServer。我们直接生成模板然后微调一下......
  • 封装avalonia指定组件允许拖动的工具类
    封装avalonia指定组件允许拖动的工具类创建Avalonia的MVVM项目,命名DragDemo,然后将项目的Nuget包更新到预览版<ItemGroup><PackageReferenceInclude="Aval......
  • 深入分析MobileAI图像超分最佳方案:ABPN
    前言 本文设计一种8-bit量化版高效网络并将其部署到移动端,旨在构建一种实时量化模型用于真实场景(比如实时视频超分)。本文转载自AIWalker来源|HappyAIWalker欢迎关......
  • Avalonia 实现平滑拖动指定控件
    Avalonia实现平滑拖动指定控件1.创建一个UserControl控件,并且添加以下代码usingSystem;usingAvalonia;usingAvalonia.Controls;usingAvalonia.Input;usingAval......
  • ABP微服务系列学习-搭建自己的微服务结构(一)
    在原本的结构里面,由于默认服务引用的都是ABP原生的模块,所以结构目录里面没有包含modules目录,这里我们添加一个modules目录,用于存放我们的自定义模块。在shared里面,我们再抽......