<ItemGroup Condition="'$(MySQL)' == 'True' "> <PackageReference Include="MySqlConnector" Version="0.47.1" /> </ItemGroup> <ItemGroup Condition="'$(PgSQL)' == 'True' "> <PackageReference Include="Npgsql" Version="4.0.3" /> </ItemGroup> <ItemGroup Condition="'$(SQLite)' == 'True' "> <PackageReference Include="Microsoft.Data.Sqlite" Version="2.1.0" /> </ItemGroup>
同样的,代码也要做相应的处理
#if (MsSQL) using System.Data.SqlClient; #elif (MySQL) using MySql.Data.MySqlClient; #elif (PgSQL) using Npgsql; #else using Microsoft.Data.Sqlite; #endif protected DbConnection GetDbConnection() { #if (MsSQL) return new SqlConnection(_connStr); #elif (MySQL) return new MySqlConnection(_connStr); #elif (PgSQL) return new NpgsqlConnection(_connStr); #else return new SqliteConnection(_connStr); #endif }
修改好之后,同样要去重新安装这个模板,安装好之后,就可以看到sqlType这个参数了。
下面分别创建一个MsSQL和PgSQL的项目,用来对比和验证。
先后执行
dotnet new tpl -n MsSQLTest -s MsSQL dotnet new tpl -n PgSQLTest -s PgSQL
然后打开对应的csproj
可以看到,PgSQL的,添加多了NPgsql这个包。而MsSQL的却没有。
同样的,DapperRepositoryBase也是一样的效果。在创建Connection对象的时候,都根据模板来生成了。
当然这个是在我们自己本地安装的模板,其他人是没有办法使用的。
如果想公开,可以发布到nuget上面去。如果是在公司内部共享,可以搭建一个内部的nuget服务,将模板上传到内部服务器里面去。
下面是一些可以开箱即用的模板:https://dotnetnew.azurewebsites.net/
总结
有一个自己的项目模板(脚手架),还是很方便的。
一建生成自己需要的东西,减少了不必要的代码复制,可以将更多精力放在业务实现上。
在平时还是要有一些积累,当积累足够丰富之后,我们的脚手架可能就会变得十分强大。
参考文档
dotnet new下面默认的模板 https://github.com/aspnet/Templating
templating的源码 https://github.com/dotnet/templating
template.json的说明 https://github.com/dotnet/templating/wiki/Reference-for-template.json
dotnet cli的文档
最后是文中的示例代码