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