wpf通过依赖注入查询多个数据库显示到页面

        

在使用依赖注入方式进行多选数据库时,我们可以将数据库选择的逻辑解耦出来,实现模块化开发。通过引入依赖注入,我们可以轻松地切换不同的数据库实现而不需要修改其他代码。这种灵活性不仅使我们的应用程序更具可扩展性,同时也使代码更加容易维护和测试。通过这种方式,我们可以将数据库选择逻辑从业务逻辑中分离出来,使代码结构更清晰,更易于理解和维护。

下面是一个简单的结构

 

我们有两个数据库分别是SqlServer、Sqlite,数据库表内结构一样

实体类

  public class Datas
  {

      public string ID { get; set; }
      public string Name { get; set; }

  }

接口

 public interface General
 {

     void Connect();
     List<Datas> SeletAll();
     List<Datas> SeletOne(string Was);
     int Delete(string ID);

 }

Sqlite接口实现类

   public class AsSqlite 
   {
       public static SqlSugarClient Client;
       public class SqlitebaseData : General
       {
           public void Connect()
           {
               Client = new SqlSugarClient(new ConnectionConfig()
               {
                   ConnectionString = "Data Source=TEe.db;",
                   DbType = SqlSugar.DbType.Sqlite,
                   IsAutoCloseConnection = true
               });
           }
           public int Delete(string ID)
           {
               var dbs = Client.Deleteable<Datas>(new Datas() { ID = ID}).ExecuteCommand();
               return dbs;
           }

           public List<Datas> SeletAll()
           {
               return Client.Queryable<Datas>().ToList();

           }

           public List<Datas> SeletOne(string Was)
           {
               var data = Client.Queryable<Datas>().Where(it => it.ID == Was).ToList();
               return data;
           }
       }

   }

Sqlserver接口实现类

  public class AsSqlserver
  {
      public static SqlSugarClient db;

      public class SqlServerDatabase : General
      {
          public void Connect()
          {
              db = new SqlSugarClient(new ConnectionConfig()
              {
                  ConnectionString = "server=.;uid=sa;pwd=123456;database=Sqler",
                  DbType = SqlSugar.DbType.SqlServer,
                  IsAutoCloseConnection = true
              });
          }
          public int Delete(string ID)
          {
              var dbs = db.Deleteable<Datas>(new Datas() { ID = ID }).ExecuteCommand();
              return dbs;
          }

          public List<Datas> SeletAll()
          {
              return db.Queryable<Datas>().ToList();

          }

          public List<Datas> SeletOne(string Was)
          {
              var data = db.Queryable<Datas>().Where(it => it.ID == Was).ToList();
              return data;
          }
      }
   
  }

数据库工厂类

SqliteDatabaseFactory类的构造函数接受一个General类型的参数,并将其保存在私有变量_general中。这个General对象被用于在Connect()和All()方法中执行具体的操作。

通过在构造函数中接受General对象作为参数,实现了依赖注入的核心概念:将依赖对象传递给类,而不是在类内部创建依赖对象。这种设计使得 SqliteDatabaseFactory类更加灵活和可测试,因为我们可以轻松地替换传递给构造函数的General对象,而不需要修改该类的代码。

同理SqlServerDatabaseFactory也一样。

 public class SqliteDatabaseFactory
 {
     public readonly General _general;
     public SqliteDatabaseFactory(General data )
     {
         _general=data;
     }
     public void Connect()
     {
         _general.Connect();
     }
     public List<Datas> All()
     {
         return _general.SeletAll();
     }
 }


 public  class SqlServerDatabaseFactory
 {
     private readonly General _database;
     public SqlServerDatabaseFactory(General database)
     {
         _database = database;
     }
     public void Connect()
     {
         _database.Connect();
        

     }
     public List<Datas> All()
     {
      return   _database.SeletAll();
     }
 }

Xaml页面

<Window
    x:Class="WpfApp2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:WpfApp2"
    xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow"
    Width="800"
    Height="450"
    WindowStartupLocation="CenterScreen"
    mc:Ignorable="d">
    <Grid>


        <TabControl
            materialDesign:ColorZoneAssist.Background="SteelBlue"
            materialDesign:ColorZoneAssist.Foreground="White"
            materialDesign:ColorZoneAssist.Mode="Custom"
            materialDesign:ElevationAssist.Elevation="Dp6">
            <TabItem Header="Sqlser">

                <GroupBox
                    Margin="16"
                    materialDesign:ColorZoneAssist.Background="SteelBlue"
                    materialDesign:ColorZoneAssist.Foreground="White"
                    materialDesign:ColorZoneAssist.Mode="Custom"
                    Background="White"
                    BorderThickness="0"
                    Header="数据"
                    Style="{StaticResource MaterialDesignGroupBox}">
                    <GroupBox.HeaderTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <materialDesign:PackIcon
                                    Width="32"
                                    Height="32"
                                    VerticalAlignment="Center"
                                    Kind="Glasses" />
                                <TextBlock
                                    Margin="8,0,0,0"
                                    VerticalAlignment="Center"
                                    Style="{StaticResource MaterialDesignSubtitle1TextBlock}"
                                    Text="{Binding}" />
                            </StackPanel>
                        </DataTemplate>
                    </GroupBox.HeaderTemplate>
                    <StackPanel>
                        <Button
                            Width="100"
                            Height="50"
                            Background="SteelBlue"
                            Command="{Binding ServerCommand}"
                            Content="查询"
                            Foreground="White" />
                        <DataGrid
                            x:Name="dataGrid"
                            AutoGenerateColumns="False"
                            CanUserAddRows="False"
                            CanUserDeleteRows="False"
                            ItemsSource="{Binding Sqlserverdatas}">
                            <DataGrid.Columns>
                                <DataGridTextColumn
                                    Width="Auto"
                                    Binding="{Binding ID}"
                                    Header="序号" />
                                <DataGridTextColumn
                                    Width="Auto"
                                    Binding="{Binding Name}"
                                    Header="名字" />

                            </DataGrid.Columns>



                        </DataGrid>
                    </StackPanel>

                </GroupBox>


            </TabItem>
            <TabItem Header="Sqllite">

                <GroupBox
                    Margin="16"
                    materialDesign:ColorZoneAssist.Background="SteelBlue"
                    materialDesign:ColorZoneAssist.Foreground="White"
                    materialDesign:ColorZoneAssist.Mode="Custom"
                    Background="White"
                    BorderThickness="0"
                    Header="数据"
                    Style="{StaticResource MaterialDesignGroupBox}">
                    <GroupBox.HeaderTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <materialDesign:PackIcon
                                    Width="32"
                                    Height="32"
                                    VerticalAlignment="Center"
                                    Kind="Glasses" />
                                <TextBlock
                                    Margin="8,0,0,0"
                                    VerticalAlignment="Center"
                                    Style="{StaticResource MaterialDesignSubtitle1TextBlock}"
                                    Text="{Binding}" />
                            </StackPanel>
                        </DataTemplate>
                    </GroupBox.HeaderTemplate>
                    <StackPanel>
                        <Button
                            Width="100"
                            Height="50"
                            Background="SteelBlue"
                            Command="{Binding SqliteCommand}"
                            Content="查询"
                            Foreground="White" />
                        <DataGrid
                            x:Name="dataGrids"
                            AutoGenerateColumns="False"
                            CanUserAddRows="False"
                            CanUserDeleteRows="False"
                            ItemsSource="{Binding Sqlitedatas}">
                            <DataGrid.Columns>
                                <DataGridTextColumn
                                    Width="Auto"
                                    Binding="{Binding ID}"
                                    Header="序号" />
                                <DataGridTextColumn
                                    Width="Auto"
                                    Binding="{Binding Name}"
                                    Header="名字" />

                            </DataGrid.Columns>



                        </DataGrid>
                    </StackPanel>

                </GroupBox>

            </TabItem>
        </TabControl>

    </Grid>
</Window>

ViewModel

下面是具体实现数据获取方式

  public partial class MainViewModel : ObservableObject

  {
      [ObservableProperty]
      public ObservableCollection<Datas> sqlserverdatas = new ObservableCollection<Datas>();
      [ObservableProperty]
      public ObservableCollection<Datas> sqlitedatas = new ObservableCollection<Datas>();
      public MainViewModel()
      {

      }
      [RelayCommand]
      public Task Server()
      {
          return Task.Run(() =>
          {

              General general = new SqlServerDatabase();
              SqlServerDatabaseFactory Mes = new SqlServerDatabaseFactory(general);
              Mes.Connect();
              var data = Mes.All();


              Application.Current.Dispatcher.Invoke((Action)delegate ()
              {

                  foreach (var item in data)
                  {
                      if (sqlserverdatas.FirstOrDefault(x=>x.ID==item.ID)==null)
                      {
                          sqlserverdatas.Add(item);
                      }
                    
                  }
              });

          });
      }
      [RelayCommand]
      public Task Sqlite()
      {
          return Task.Run(() =>
          {

              General general = new SqlitebaseData();
              SqliteDatabaseFactory Mes = new SqliteDatabaseFactory(general);
              Mes.Connect();
              var data = Mes.All();


              Application.Current.Dispatcher.Invoke((Action)delegate ()
              {

                  foreach (var item in data)
                  {
                      if (sqlitedatas.FirstOrDefault(x => x.ID == item.ID) == null)
                      {
                          sqlitedatas.Add(item);
                      }
                  }
              });

          });
      }
      
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值