问题描述
我们创建了一个“本地” Web应用程序,我的任务是为该应用程序创建一个安装程序,该安装程序将允许用户以编程方式在sqlite或sql Server实现之间进行选择。我对如何做到这一点零头,也没有找到任何有明确方向的好文章。
我所要做的就是在Startup.cs
文件中编写以下代码,以在位于appsettings.json
文件中的两个连接字符串之间进行选择。有谁知道创建/实施安装程序的最佳方法?是否有针对此类问题的开源解决方案?我对此感到很迷茫。...
protected virtual IServiceCollection ConfigureDbContext(IServiceCollection services)
{
var issqlServerConnection = Configuration.GetValue<bool>("Usesql");
if (issqlServerConnection)
{
services.AddDbContext<SecurityDbContext>(options =>
options.UsesqlServer(Configuration.GetConnectionString("Default")).UseQueryTrackingBehavior(QueryTrackingBehavior.TrackAll),ServiceLifetime.Transient);
services.AddDbContext<StorageContext>(options =>
options.Usesqlite(Configuration.GetConnectionString("Default")).UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking),ServiceLifetime.Transient);
}
else
{
services.AddDbContext<SecurityDbContext>(options =>
options.Usesqlite(Configuration.GetConnectionString("sqlite")).UseQueryTrackingBehavior(QueryTrackingBehavior.TrackAll),ServiceLifetime.Transient);
services.AddDbContext<StorageContext>(options =>
options.Usesqlite(Configuration.GetConnectionString("sqlite")).UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking),ServiceLifetime.Transient);
}
return services;
}
解决方法
使用Visual Studio创建安装程序
- 关闭除一个Visual Studio实例外的所有实例。
- 在运行的实例中,访问菜单工具->扩展和更新。
- 在该对话框中,选择“联机”->“ Visual Studio市场”->“工具”->“设置和部署”。
- 从出现的列表中,选择“ Microsoft Visual Studio 2017安装程序项目”。
- 安装后,关闭并重新启动Visual Studio。转到文件->新建项目,然后搜索单词Installer。如果您看到类似以下内容的列表,就会知道安装了正确的模板:
- 使用安装项目创建安装程序来满足您的需求。您可以轻松地在安装程序上创建一个页面,用户可以在其中选择SQLite或SQL Server作为支持的数据。
这里有一些有关创建安装程序和所需扩展程序的其他资源。您可能需要其他版本的扩展程序,具体取决于您的Visual Studio版本。
https://www.add-in-express.com/docs/net-msi-setup-project.php
,您也可以使用“ Inno Setup”来创建安装程序。有很多示例代码。基本上,您需要做一些事情。
准备:创建您自己的工具以将信息写入appSettings.json。 exe应将参数作为参数,并基于这些参数生成一个appSetting.json文件。
- 在inno设置文件部分中,设置构建的构件和您自己的json生成工具的路径。
//样品代码
[Files]
Source: bin\*; DestDir: {app}\bin; Flags: recursesubdirs uninsneveruninstall; Components: Main
Source: Utilities\AppSettingGenerator.exe; DestDir: {app}\Utilities\AppSettingGenerator.exe; Components: " Main"; Tasks: ; Flags: uninsneveruninstall;
- 创建一个屏幕,允许用户选择数据库引擎,sqllite或Sql服务器。
- 创建另一个屏幕来设置连接字符串。
//样本代码。创建安装程序屏幕。
procedure FormCreatePage(PreviousPageId: Integer);
begin
pgeInstallType := CreateInputOptionPage( wpWelcome,'Select Installation Type','Which type of installation do you want to run?','Select the type of installation that you would like to run. Click Next when you are ready to continue.',true,false
);
pgeInstallType.Add('Sqllite');
pgeInstallType.Add('Sql Server');
pgeInstallType.Values[0] := true;
pgeInput1 := CreateCustomPage( PreviousPageId,'Configure Sql Server Connection','Please verify the details for those sections highlighted in red before continuing.'
);
pgeInput2 := CreateCustomPage( pgeInput1.ID,'Configure Sql lite Connection','Please verify the details for those sections highlighted in red before continuing.'
);
end;
//示例代码。创建UI控件以让用户键入Sql Server连接
pnlSQL := TPanel.Create(pgeInput1);
with pnlSQL do
begin
Parent := pgeInput1.Surface;
Left := ScaleX(0);
Top := ScaleY(30);
Width := ScaleX(413);
Height := ScaleY(125);
BevelInner := bvLowered;
end;
{ lblPnlSQL }
lblPnlSQL := TLabel.Create(pgeInput1);
with lblPnlSQL do
begin
Parent := pnlSQL;
Left := ScaleX(340);
Top := ScaleY(5);
Width := ScaleX(70);
Height := ScaleY(13);
AutoSize := False;
Caption := 'SQL Server';
Font.Height := ScaleY(-11);
Font.Style := [fsBold,fsItalic];
end;
{ lblSrvName }
lblSrvName := TLabel.Create(pgeInput1);
with lblSrvName do
begin
Parent := pnlSQL;
Left := ScaleX(5);
Top := ScaleY(5);
Width := ScaleX(66);
Height := ScaleY(13);
Caption := 'Server Name:';
Font.Height := ScaleY(-11);
end;
{ lblUserID }
lblUserID := TLabel.Create(pgeInput1);
with lblUserID do
begin
Parent := pnlSQL;
Left := ScaleX(5);
Top := ScaleY(25);
Width := ScaleX(40);
Height := ScaleY(13);
Caption := 'User ID:';
Font.Height := ScaleY(-11);
end;
{ lblPassword }
lblPassword := TLabel.Create(pgeInput1);
with lblPassword do
begin
Parent := pnlSQL;
Left := ScaleX(5);
Top := ScaleY(46);
Width := ScaleX(50);
Height := ScaleY(13);
Caption := 'Password:';
Font.Height := ScaleY(-11);
end;
{ lblDBName }
lblDBName := TLabel.Create(pgeInput1);
with lblDBName do
begin
Parent := pnlSQL;
Left := ScaleX(5);
Top := ScaleY(67);
Width := ScaleX(80);
Height := ScaleY(13);
Caption := 'Database Name:';
Font.Height := ScaleY(-11);
end;
- 在安装程序屏幕上输入参数后,调用appsettingGenerator工具。
//样本代码。在nextbuttonClick上调用它,然后检查当前页面是否正确
function NextButtonClick(CurPageID: Integer): Boolean;
var i: Integer;
begin
if CurPageID = pgeInput2.ID then
begin
RunExe(gUtilAppsettingGenerator,' -dbuid "' + txtUserID.Text + '"
-dbpass "' + txtPassword.Text + '" -c "server=' + txtSrvName.Text + ';database=' + txtDBName.Text + '" -dbinst "' + txtDSN.Text + '"',ewWaitUntilTerminated,true);
end;