From 1a729477407d9f78345c3beb52f510dc339a8269 Mon Sep 17 00:00:00 2001
From: root <8907060@qq.com>
Date: Mon, 20 Jun 2022 12:38:59 +0800
Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0util=206.x?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 1 +
Util.sln | 304 +-
build/Build.csproj | 2 +-
build/BuildScript.cs | 98 +-
sample/Util.WebApi.Sample/Program.cs | 31 +
.../Properties/AssemblyInfo.cs | 2 +
.../Properties/launchSettings.json | 31 +
.../Util.WebApi.Sample.csproj | 21 +
.../appsettings.Development.json | 8 +
sample/Util.WebApi.Sample/appsettings.json | 10 +
solutions/Util.Data.slnf | 57 +
solutions/Util.Localization.slnf | 19 +
...e.csproj => 03-Util.Aop.AspectCore.csproj} | 0
.../AopOptionsExtension.cs | 42 +-
.../HostBuilderExtensions.cs | 19 -
src/Util.Aop.AspectCore/OptionsExtensions.cs | 8 +-
.../ServiceCollectionExtensions.cs | 43 -
.../CrudServiceBase.cs | 2 +-
.../Controllers/QueryControllerBase.cs | 6 +-
.../Controllers/WebApiControllerBase.cs | 22 +-
.../Filters/ExceptionHandlerAttribute.cs | 42 +-
src/Util.Application.WebApi/IResultFactory.cs | 18 +
.../Infrastructure/WebApiServiceRegistrar.cs | 15 +-
src/Util.Application.WebApi/Result.cs | 28 +-
.../Util.Application.WebApi.csproj | 2 +-
src/Util.Application/Dtos/RequestBase.cs | 17 +-
src/Util.Application/ExceptionExtensions.cs | 30 +
src/Util.Application/StateCode.cs | 8 +-
src/Util.Application/Util.Application.csproj | 1 +
...tCore.csproj => 07-Util.AspNetCore.csproj} | 0
src/Util.AspNetCore/Helpers/Web.cs | 12 +
src/Util.AspNetCore/Http/HttpRequest.cs | 12 +-
.../AspNetCoreServiceRegistrar.cs | 19 +-
.../Security/DataProtectionEncryptor.cs | 36 +
src/Util.Core/01-Util.Core.csproj | 14 +-
src/Util.Core/Configs/IOptionsExtension.cs | 20 +-
src/Util.Core/Configs/OptionsBase.cs | 6 +-
src/Util.Core/Configs/OptionsExtensionBase.cs | 22 +
src/Util.Core/Configs/PreOptions.cs | 7 +
src/Util.Core/DateTimeExtensions.cs | 31 +-
src/Util.Core/Dates/OptionsExtensions.cs | 18 +
src/Util.Core/Dates/TimeOptions.cs | 11 +
.../Exceptions/ConcurrencyException.cs | 24 +-
src/Util.Core/Exceptions/Warning.cs | 28 +-
src/Util.Core/Helpers/Common.cs | 2 +-
src/Util.Core/Helpers/Config.cs | 40 +-
src/Util.Core/Helpers/Convert.cs | 28 +-
src/Util.Core/Helpers/Culture.cs | 38 +
src/Util.Core/Helpers/Enum.cs | 4 +-
src/Util.Core/Helpers/Environment.cs | 60 +
src/Util.Core/Helpers/Id.cs | 13 +-
src/Util.Core/Helpers/Json.cs | 40 +
src/Util.Core/Helpers/Platform.cs | 6 +-
src/Util.Core/Helpers/Time.cs | 60 +-
src/Util.Core/HostBuilderExtensions.cs | 59 +
src/Util.Core/Infrastructure/Bootstrapper.cs | 47 +-
.../DependencyServiceRegistrar.cs | 15 +-
.../Infrastructure/IServiceRegistrar.cs | 18 +-
src/Util.Core/Properties/R.Designer.cs | 101 +-
src/Util.Core/Properties/R.resx | 33 +
.../Properties/UtilCoreResource.Designer.cs | 162 -
src/Util.Core/Security/IEncryptor.cs | 17 +
src/Util.Core/Security/NullEncryptor.cs | 27 +
src/Util.Core/ServiceCollectionExtensions.cs | 35 +-
.../SystemTextJson/DateTimeJsonConverter.cs | 52 +
.../NullableDateTimeJsonConverter.cs | 56 +
.../Stores/IQueryStore.cs | 2 +-
src/Util.Data.Abstractions/Stores/IStore.cs | 46 +-
src/Util.Data.Core/01-Util.Data.Core.csproj | 4 +-
src/Util.Data.Core/IUnitOfWork.cs | 4 -
.../Conditions/WhereIfNotEmptyCondition.cs | 2 +-
src/Util.Data.Core/Trees/TreeCondition.cs | 3 -
.../05-Util.Data.Dapper.All.csproj | 35 +
.../Infrastructure/DapperServiceRegistrar.cs | 41 +
.../ServiceRegistrarConfigExtensions.cs | 26 +
.../Metadata/MetadataServiceFactory.cs | 72 +
.../Metadata/TypeConverterFactory.cs | 24 +
.../01-Util.Data.Dapper.Core.csproj | 53 +
.../UtilDataDapperResource.Designer.cs | 81 +
.../Properties/UtilDataDapperResource.resx} | 35 +-
.../Sql/SqlExecutorBase.cs | 78 +
src/Util.Data.Dapper.Core/Sql/SqlQueryBase.cs | 1411 +++
.../04-Util.Data.Dapper.MySql.csproj | 37 +
.../Metadata/MySqlMetadataService.cs | 79 +
.../Metadata/MySqlTypeConverter.cs | 55 +
.../Sql/Builders/MySqlBuilder.cs | 39 +
.../Sql/Builders/MySqlColumnCache.cs | 36 +
.../Sql/Builders/MySqlDialect.cs | 34 +
.../Sql/Builders/MySqlExistsSqlBuilder.cs | 52 +
.../Sql/MySqlDatabaseFactory.cs | 16 +
.../Sql/MySqlExecutor.cs | 18 +
.../Sql/MySqlExecutorBase.cs | 39 +
.../Sql/MySqlExecutorOptionsExtension.cs | 32 +
src/Util.Data.Dapper.MySql/Sql/MySqlQuery.cs | 18 +
.../Sql/MySqlQueryBase.cs | 33 +
.../Sql/MySqlQueryOptionsExtension.cs | 32 +
.../Sql/OptionsExtensions.cs | 120 +
.../03-Util.Data.Dapper.PostgreSql.csproj | 37 +
.../Metadata/PostgreSqlMetadataService.cs | 101 +
.../Metadata/PostgreSqlTypeConverter.cs | 53 +
.../Sql/Builders/PostgreSqlBuilder.cs | 39 +
.../Sql/Builders/PostgreSqlColumnCache.cs | 36 +
.../Sql/Builders/PostgreSqlDialect.cs | 34 +
.../Builders/PostgreSqlExistsSqlBuilder.cs | 52 +
.../Sql/OptionsExtensions.cs | 120 +
.../Sql/PostgreSqlDatabaseFactory.cs | 16 +
.../Sql/PostgreSqlExecutor.cs | 18 +
.../Sql/PostgreSqlExecutorBase.cs | 67 +
.../Sql/PostgreSqlExecutorOptionsExtension.cs | 32 +
.../Sql/PostgreSqlQuery.cs | 18 +
.../Sql/PostgreSqlQueryBase.cs | 56 +
.../Sql/PostgreSqlQueryOptionsExtension.cs | 32 +
.../02-Util.Data.Dapper.SqlServer.csproj | 37 +
.../Metadata/SqlServerMetadataService.cs | 110 +
.../Metadata/SqlServerTypeConverter.cs | 71 +
.../Sql/Builders/SqlServerBuilder.cs | 39 +
.../Sql/Builders/SqlServerColumnCache.cs | 36 +
.../Sql/Builders/SqlServerDialect.cs | 34 +
.../Sql/Builders/SqlServerExistsSqlBuilder.cs | 52 +
.../Sql/OptionsExtensions.cs | 120 +
.../Sql/SqlServerDatabaseFactory.cs | 16 +
.../Sql/SqlServerSqlExecutor.cs | 18 +
.../Sql/SqlServerSqlExecutorBase.cs | 39 +
.../SqlServerSqlExecutorOptionsExtension.cs | 32 +
.../Sql/SqlServerSqlQuery.cs | 18 +
.../Sql/SqlServerSqlQueryBase.cs | 33 +
.../Sql/SqlServerSqlQueryOptionsExtension.cs | 32 +
...Util.Data.EntityFrameworkCore.MySql.csproj | 37 +
.../MySqlOptionsExtension.cs | 62 +
.../MySqlUnitOfWorkBase.cs | 18 +
.../OptionsExtensions.cs | 51 +
...til.Data.EntityFrameworkCore.Oracle.csproj | 37 +
.../OptionsExtensions.cs | 51 +
.../OracleOptionsExtension.cs | 61 +
.../OracleUnitOfWorkBase.cs | 18 +
...Data.EntityFrameworkCore.PostgreSql.csproj | 8 +-
.../PgSqlOptionsExtension.cs | 12 +-
....Data.EntityFrameworkCore.SqlServer.csproj | 4 +-
.../SqlServerOptionsExtension.cs | 12 +-
...til.Data.EntityFrameworkCore.Sqlite.csproj | 37 +
.../OptionsExtensions.cs | 51 +
.../SqliteOptionsExtension.cs | 61 +
.../SqliteUnitOfWorkBase.cs | 18 +
.../01-Util.Data.EntityFrameworkCore.csproj | 6 +-
.../EntityFrameworkServiceRegistrar.cs | 8 +-
.../StoreBase.cs | 228 +-
.../UnitOfWorkBase.cs | 68 +-
.../ValueConverters/DateTimeValueConverter.cs | 20 +
.../ExtraPropertiesValueConverter.cs | 3 +-
.../03-Util.Data.Metadata.csproj | 32 +
src/Util.Data.Metadata/ColumnInfo.cs | 47 +
src/Util.Data.Metadata/DatabaseInfo.cs | 28 +
src/Util.Data.Metadata/IMetadataService.cs | 11 +
.../IMetadataServiceFactory.cs | 13 +
src/Util.Data.Metadata/ITypeConverter.cs | 15 +
.../ITypeConverterFactory.cs | 12 +
src/Util.Data.Metadata/TableInfo.cs | 36 +
src/Util.Data.Sql/02-Util.Data.Sql.csproj | 34 +
.../Builders/Caches/ColumnCacheBase.cs | 63 +
.../Builders/Caches/IColumnCache.cs | 17 +
.../Builders/Clauses/ClauseBase.cs | 34 +
.../Builders/Clauses/EndClause.cs | 209 +
.../Builders/Clauses/FromClause.cs | 127 +
.../Builders/Clauses/GroupByClause.cs | 157 +
.../Builders/Clauses/IEndClause.cs | 43 +
.../Builders/Clauses/IFromClause.cs | 41 +
.../Builders/Clauses/IGroupByClause.cs | 41 +
.../Builders/Clauses/IInsertClause.cs | 39 +
.../Builders/Clauses/IJoinClause.cs | 101 +
.../Builders/Clauses/IOrderByClause.cs | 27 +
.../Builders/Clauses/ISelectClause.cs | 55 +
.../Builders/Clauses/ISqlClause.cs | 11 +
.../Builders/Clauses/IStartClause.cs | 38 +
.../Builders/Clauses/IWhereClause.cs | 129 +
.../Builders/Clauses/InsertClause.cs | 181 +
.../Builders/Clauses/JoinClause.cs | 323 +
.../Builders/Clauses/OrderByClause.cs | 115 +
.../Builders/Clauses/SelectClause.cs | 161 +
.../Builders/Clauses/StartClause.cs | 198 +
.../Builders/Clauses/WhereClause.cs | 308 +
.../Builders/Conditions/AndCondition.cs | 52 +
.../Builders/Conditions/ContainsCondition.cs | 41 +
.../Builders/Conditions/EndsCondition.cs | 41 +
.../Builders/Conditions/EqualCondition.cs | 51 +
.../Builders/Conditions/ExistsCondition.cs | 35 +
.../Builders/Conditions/GreaterCondition.cs | 39 +
.../Conditions/GreaterEqualCondition.cs | 39 +
.../Builders/Conditions/InCondition.cs | 136 +
.../Builders/Conditions/IsNotNullCondition.cs | 31 +
.../Builders/Conditions/IsNullCondition.cs | 31 +
.../Builders/Conditions/LessCondition.cs | 39 +
.../Builders/Conditions/LessEqualCondition.cs | 39 +
.../Builders/Conditions/NotEqualCondition.cs | 51 +
.../Builders/Conditions/NotExistsCondition.cs | 35 +
.../Builders/Conditions/NotInCondition.cs | 26 +
.../Builders/Conditions/NullCondition.cs | 26 +
.../Builders/Conditions/OrCondition.cs | 85 +
.../Builders/Conditions/SegmentCondition.cs | 96 +
.../Builders/Conditions/SqlCondition.cs | 29 +
.../Builders/Conditions/SqlConditionBase.cs | 110 +
.../Builders/Conditions/StartsCondition.cs | 41 +
src/Util.Data.Sql/Builders/Core/ColumnItem.cs | 94 +
src/Util.Data.Sql/Builders/Core/CteItem.cs | 33 +
.../Builders/Core/DialectBase.cs | 62 +
src/Util.Data.Sql/Builders/Core/NameItem.cs | 69 +
.../Builders/Core/OrderByItem.cs | 34 +
src/Util.Data.Sql/Builders/Core/SplitItem.cs | 37 +
.../Builders/Core/SqlBuilderItem.cs | 46 +
src/Util.Data.Sql/Builders/Core/TableItem.cs | 101 +
.../Builders/IConditionFactory.cs | 26 +
src/Util.Data.Sql/Builders/IDialect.cs | 29 +
.../Builders/IExistsSqlBuilder.cs | 11 +
src/Util.Data.Sql/Builders/ISqlContent.cs | 14 +
.../Builders/ISqlPartAccessor.cs | 59 +
src/Util.Data.Sql/Builders/Operations/IEnd.cs | 7 +
.../Builders/Operations/IFrom.cs | 7 +
.../Builders/Operations/IGroupBy.cs | 7 +
.../Builders/Operations/IInsert.cs | 7 +
.../Builders/Operations/IJoin.cs | 7 +
.../Builders/Operations/IOrderBy.cs | 7 +
.../Builders/Operations/ISelect.cs | 7 +
src/Util.Data.Sql/Builders/Operations/ISet.cs | 7 +
.../Builders/Operations/ISqlOperation.cs | 7 +
.../Builders/Operations/ISqlParameter.cs | 7 +
.../Builders/Operations/ISqlQueryOperation.cs | 7 +
.../Builders/Operations/IStart.cs | 7 +
.../Builders/Operations/IWhere.cs | 7 +
.../Builders/Params/IClearParameters.cs | 11 +
.../Builders/Params/IGetParameter.cs | 13 +
.../Builders/Params/IParamLiteralsResolver.cs | 12 +
.../Builders/Params/IParameterManager.cs | 66 +
.../Builders/Params/ParamLiteralsResolver.cs | 28 +
.../Builders/Params/ParameterManager.cs | 157 +
src/Util.Data.Sql/Builders/Params/SqlParam.cs | 57 +
.../Builders/Sets/ISqlBuilderSet.cs | 62 +
.../Builders/Sets/SqlBuilderSet.cs | 254 +
.../Builders/Sets/SqlBuilderSetItem.cs | 33 +
src/Util.Data.Sql/Builders/SqlBuilderBase.cs | 349 +
.../Builders/SqlBuilderResult.cs | 79 +
.../Builders/SqlConditionFactory.cs | 77 +
src/Util.Data.Sql/Configs/ISqlOptions.cs | 7 +
.../Configs/ISqlOptionsAccessor.cs | 11 +
.../Database/IConnectionManager.cs | 18 +
.../Database/ITransactionManager.cs | 35 +
src/Util.Data.Sql/EndClauseExtensions.cs | 106 +
src/Util.Data.Sql/FromClauseExtensions.cs | 85 +
src/Util.Data.Sql/GroupByClauseExtensions.cs | 94 +
src/Util.Data.Sql/ISqlBuilder.cs | 26 +
src/Util.Data.Sql/ISqlCondition.cs | 9 +
src/Util.Data.Sql/ISqlExecutor.cs | 21 +
src/Util.Data.Sql/ISqlQuery.cs | 468 +
src/Util.Data.Sql/InsertClauseExtensions.cs | 98 +
src/Util.Data.Sql/JoinClauseExtensions.cs | 239 +
src/Util.Data.Sql/OrderByClauseExtensions.cs | 58 +
src/Util.Data.Sql/ParameterExtensions.cs | 132 +
src/Util.Data.Sql/SelectClauseExtensions.cs | 120 +
src/Util.Data.Sql/SqlBuilderSetExtensions.cs | 138 +
src/Util.Data.Sql/SqlExecutorExtensions.cs | 143 +
src/Util.Data.Sql/SqlOptions.cs | 27 +
src/Util.Data.Sql/SqlOptionsExtensions.cs | 54 +
src/Util.Data.Sql/SqlQueryExtensions.Query.cs | 303 +
.../SqlQueryExtensions.Scalar.cs | 457 +
src/Util.Data.Sql/SqlQueryExtensions.cs | 68 +
src/Util.Data.Sql/StartClauseExtensions.cs | 105 +
src/Util.Data.Sql/WhereClauseExtensions.cs | 374 +
.../Auditing/CreationAuditedSetter.cs | 14 +-
.../Auditing/ModificationAuditedSetter.cs | 14 +-
src/Util.Domain/Entities/EntityBase.cs | 2 +-
src/Util.Domain/Extending/ExtraProperty.cs | 2 +-
src/Util.Events/01-Util.Events.csproj | 4 +-
.../LocalEventBusServiceRegistrar.cs | 13 +-
.../04-Util.Localization.csproj | 36 +
src/Util.Localization/Json/IPathResolver.cs | 34 +
.../Json/JsonStringLocalizer.cs | 156 +
.../Json/JsonStringLocalizerFactory.cs | 62 +
.../JsonStringLocalizerLoggerExtensions.cs | 23 +
src/Util.Localization/Json/PathResolver.cs | 49 +
src/Util.Localization/Json/StringLocalizer.cs | 43 +
.../JsonLocalizationOptionsExtension.cs | 38 +
src/Util.Localization/OptionsExtensions.cs | 18 +
...-Util.Logging.Serilog.Exceptionless.csproj | 4 +-
.../ExceptionlessOptionsExtension.cs | 14 +-
.../OptionsExtensions.cs | 4 +-
.../02-Util.Logging.Serilog.csproj | 2 +-
.../SerilogOptionsExtension.cs | 14 +-
src/Util.Logging/ILogExtensions.cs | 58 +-
src/Util.Logging/Log.cs | 9 +
src/Util.Logging/NullLog.cs | 80 +
...> 02-Util.ObjectMapping.AutoMapper.csproj} | 2 +-
.../AutoMapperServiceRegistrar.cs | 10 +-
.../ObjectMapper.cs | 14 +-
.../03-Util.Templates.Handlebars.csproj | 2 +-
.../HandlebarsServiceRegistrar.cs | 13 +-
.../02-Util.Templates.Razor.csproj | 5 +-
.../Infrastructure/RazorServiceRegistrar.cs | 11 +-
src/Util.Validation/05-Util.Validation.csproj | 2 +-
test/Util.Aop.AspectCore.Tests/Startup.cs | 10 +-
.../Util.Aop.AspectCore.Tests.csproj | 14 +-
.../Startup.cs | 54 +
.../Tests/CustomerQueryServiceTest.cs | 215 +
.../Tests/CustomerServiceTest.cs | 40 +
.../Tests/ProductServiceTest.cs | 217 +
...ameworkCore.MySql.Tests.Integration.csproj | 39 +
.../appsettings.Development.json | 11 +
.../appsettings.json | 11 +
.../Startup.cs | 56 +
.../Tests/CustomerQueryServiceTest.cs | 215 +
.../Tests/CustomerServiceTest.cs | 40 +
.../Tests/ProductServiceTest.cs | 217 +
...rkCore.PostgreSql.Tests.Integration.csproj | 39 +
.../appsettings.Development.json | 11 +
.../appsettings.json | 11 +
.../Models/Customer.cs | 116 -
.../Models/Product.cs | 127 -
.../Models/ProductItem.cs | 15 -
.../Models/ProductItem2.cs | 15 -
.../Repositories/ICustomerRepository.cs | 10 -
.../Services/CustomerService.cs | 23 -
.../Services/ICustomerService.cs | 10 -
.../Services/IProductService.cs | 10 -
.../Startup.cs | 25 +-
.../Tests/CustomerQueryServiceTest.cs | 40 +-
.../Tests/CustomerServiceTest.cs | 4 +-
.../Tests/ProductServiceTest.cs | 46 +-
.../UnitOfWorks/ISqlServerUnitOfWork.cs | 9 -
.../UnitOfWorks/SqlServerUnitOfWork.cs | 18 -
...orkCore.SqlServer.Tests.Integration.csproj | 36 +-
.../appsettings.Development.json | 11 +
.../appsettings.json | 8 +-
.../Util.Application.Tests.csproj | 8 +-
.../Properties/launchSettings.json | 12 +
.../Startup.cs | 21 +-
.../Tests/CustomerControllerTest.cs | 20 +-
.../Tests/ProductControllerTest.cs | 10 +-
...tion.WebApi.MySql.Tests.Integration.csproj | 42 +
.../appsettings.Development.json | 11 +
.../appsettings.json | 11 +
.../Properties/launchSettings.json | 12 +
.../Startup.cs | 72 +
.../Tests/CustomerControllerTest.cs | 115 +
.../Tests/ProductControllerTest.cs | 132 +
...WebApi.PostgreSql.Tests.Integration.csproj | 42 +
.../appsettings.Development.json | 11 +
.../appsettings.json | 11 +
.../Properties/launchSettings.json | 0
.../Startup.cs | 70 +
.../Tests/CustomerControllerTest.cs | 115 +
.../Tests/ProductControllerTest.cs | 132 +
...WebApi.SqlServer.Tests.Integration.csproj} | 27 +-
.../appsettings.Development.json} | 8 +-
.../appsettings.json | 11 +
.../Dtos/CustomerDto.cs | 87 -
.../Dtos/ProductDto.cs | 71 -
.../Fakes/CustomerFakeService.cs | 49 -
.../Fakes/ProductFakeService.cs | 49 -
.../Models/Customer.cs | 116 -
.../Models/Product.cs | 97 -
.../Queries/CustomerQuery.cs | 85 -
.../Queries/ProductQuery.cs | 67 -
.../Repositories/IProductRepository.cs | 15 -
.../Services/ProductService.cs | 22 -
.../UnitOfWorks/ISqlServerUnitOfWork.cs | 9 -
.../UnitOfWorks/SqlServerUnitOfWork.cs | 18 -
.../Samples/Certificate/apiclient_cert.p12 | Bin 0 -> 2710 bytes
.../Samples/Certificate/apiclient_cert.pem | 23 +
.../Samples/Certificate/apiclient_key.pem | 28 +
test/Util.AspNetCore.Tests/Startup.cs | 4 +-
.../Util.AspNetCore.Tests.csproj | 16 +-
.../Helpers/ConfigTest.cs | 10 -
.../Infrastructure/BootstrapperTest.cs | 34 +-
.../DependencyServiceRegistrarTest.cs | 32 +-
.../Samples/TestOptionsExtension.cs | 6 +-
.../Samples/TestServiceRegistrar.cs | 27 +-
.../Util.Core.Tests.Integration.csproj | 13 +-
.../appsettings2.json | 6 -
.../Util.Core.Tests/Exceptions/WarningTest.cs | 8 +-
.../Extensions/DateTimeExtensionsTest.cs | 150 +-
test/Util.Core.Tests/Helpers/ConvertTest.cs | 21 +-
test/Util.Core.Tests/Helpers/CultureTest.cs | 22 +
test/Util.Core.Tests/Helpers/JsonTest.cs | 118 +-
test/Util.Core.Tests/Helpers/TimeTest.cs | 211 +-
.../Util.Core.Tests/Samples/JsonTestSample.cs | 12 +-
test/Util.Core.Tests/Util.Core.Tests.csproj | 8 +-
.../Infrastructure/DatabaseScript.cs | 126 +
.../Metadata/MySqlMetadataServiceTest.cs | 112 +
.../SqlBuilders/MySqlExistsSqlBuilderTest.cs | 48 +
.../SqlExecutor/MySqlExecutorTest.Execute.cs | 28 +
.../SqlExecutor/MySqlExecutorTest.Id.cs | 67 +
.../SqlExecutor/MySqlExecutorTest.Insert.cs | 83 +
.../SqlExecutor/MySqlExecutorTest.Param.cs | 81 +
.../MySqlExecutorTest.Procedure.cs | 35 +
.../MySqlExecutorTest.Transaction.cs | 250 +
.../SqlExecutor/MySqlExecutorTest.cs | 31 +
.../SqlQuery/MySqlQueryTest.Exists.cs | 48 +
.../SqlQuery/MySqlQueryTest.Procedure.cs | 301 +
.../SqlQuery/MySqlQueryTest.Query.cs | 388 +
.../SqlQuery/MySqlQueryTest.Scalar.cs | 629 ++
.../SqlQuery/MySqlQueryTest.Single.cs | 52 +
.../SqlQuery/MySqlQueryTest.cs | 25 +
.../Startup.cs | 63 +
...Data.Dapper.MySql.Tests.Integration.csproj | 43 +
.../appsettings.Development.json | 11 +
.../appsettings.json | 11 +
.../Infrastructure/DatabaseScript.cs | 125 +
.../Metadata/PostgreSqlMetadataServiceTest.cs | 99 +
.../PostgreSqlExistsSqlBuilderTest.cs | 48 +
.../PostgreSqlExecutorTest.Execute.cs | 28 +
.../SqlExecutor/PostgreSqlExecutorTest.Id.cs | 67 +
.../PostgreSqlExecutorTest.Insert.cs | 83 +
.../PostgreSqlExecutorTest.Param.cs | 86 +
.../PostgreSqlExecutorTest.Procedure.cs | 35 +
.../SqlExecutor/PostgreSqlExecutorTest.cs | 31 +
.../SqlServerSqlExecutorTest.Transaction.cs | 206 +
.../SqlQuery/PostgreSqlQueryTest.Exists.cs | 48 +
.../SqlQuery/PostgreSqlQueryTest.Procedure.cs | 233 +
.../SqlQuery/PostgreSqlQueryTest.Query.cs | 388 +
.../SqlQuery/PostgreSqlQueryTest.Scalar.cs | 629 ++
.../SqlQuery/PostgreSqlQueryTest.Single.cs | 52 +
.../SqlQuery/PostgreSqlQueryTest.cs | 25 +
.../Startup.cs | 65 +
...Dapper.PostgreSql.Tests.Integration.csproj | 43 +
.../appsettings.Development.json | 11 +
.../appsettings.json | 11 +
.../Infrastructure/DatabaseScript.cs | 138 +
.../Metadata/SqlServerMetadataServiceTest.cs | 99 +
.../SqlServerExistsSqlBuilderTest.cs | 48 +
.../SqlServerSqlExecutorTest.Execute.cs | 28 +
.../SqlServerSqlExecutorTest.Id.cs | 67 +
.../SqlServerSqlExecutorTest.Insert.cs | 83 +
.../SqlServerSqlExecutorTest.Param.cs | 102 +
.../SqlServerSqlExecutorTest.Procedure.cs | 35 +
.../SqlServerSqlExecutorTest.Transaction.cs | 206 +
.../SqlExecutor/SqlServerSqlExecutorTest.cs | 31 +
.../SqlQuery/SqlServerSqlQueryTest.Exists.cs | 48 +
.../SqlServerSqlQueryTest.Procedure.cs | 303 +
.../SqlQuery/SqlServerSqlQueryTest.Query.cs | 388 +
.../SqlQuery/SqlServerSqlQueryTest.Scalar.cs | 629 ++
.../SqlQuery/SqlServerSqlQueryTest.Single.cs | 52 +
.../SqlQuery/SqlServerSqlQueryTest.cs | 25 +
.../Startup.cs | 63 +
....Dapper.SqlServer.Tests.Integration.csproj | 43 +
.../appsettings.Development.json | 11 +
.../appsettings.json | 11 +
.../Filters/DeleteFilterTest.cs | 2 +-
.../Filters/FilterManagerTest.cs | 4 +-
.../Startup.cs | 16 +-
.../Tests/CustomerRepositoryTest.cs | 190 +-
.../Tests/EntityEventsTest.cs | 103 +-
.../Tests/OperationLogRepositoryTest.cs | 29 +-
.../Tests/OrderRepositoryTest.cs | 56 +-
.../Tests/PostRepositoryTest.cs | 10 +-
.../Tests/ProductRepositoryTest.Queryable.cs | 115 +-
.../Tests/ProductRepositoryTest.cs | 1408 +++
.../Tests/TagRepositoryTest.cs | 10 +-
...ameworkCore.MySql.Tests.Integration.csproj | 39 +
.../appsettings.Development.json | 11 +
.../appsettings.json | 11 +
.../Filters/DeleteFilterTest.cs | 81 +
.../Filters/FilterManagerTest.cs | 101 +
.../Startup.cs | 16 +-
.../Tests/CustomerRepositoryTest.cs | 196 +-
.../Tests/EntityEventsTest.cs | 211 +
.../Tests/OperationLogRepositoryTest.cs | 31 +-
.../Tests/OrderRepositoryTest.cs | 56 +-
.../Tests/PostRepositoryTest.cs | 54 +
.../Tests/ProductRepositoryTest.Queryable.cs | 120 +-
.../Tests/ProductRepositoryTest.cs | 1408 +++
.../Tests/TagRepositoryTest.cs | 41 +
...meworkCore.Oracle.Tests.Integration.csproj | 40 +
.../appsettings.Development.json | 11 +
.../appsettings.json | 11 +
.../Filters/DeleteFilterTest.cs | 81 +
.../Filters/FilterManagerTest.cs | 101 +
.../Startup.cs | 55 +
.../Tests/CustomerRepositoryTest.cs | 604 ++
.../Tests/EntityEventsTest.cs | 211 +
.../Tests/OperationLogRepositoryTest.cs | 63 +
.../Tests/OrderRepositoryTest.cs | 130 +
.../Tests/PostRepositoryTest.cs | 54 +
.../Tests/ProductRepositoryTest.Queryable.cs | 390 +
.../Tests/ProductRepositoryTest.cs | 756 +-
.../Tests/TagRepositoryTest.cs | 41 +
...rkCore.PostgreSql.Tests.Integration.csproj | 39 +
.../appsettings.Development.json | 11 +
.../appsettings.json | 11 +
.../Fakes/CustomerFakeService.cs | 33 -
.../Fakes/OrderFakeService.cs | 29 -
.../Fakes/ProductFakeService.cs | 31 -
.../Infrastructure/TestBase.cs | 20 -
.../Infrastructure/TestSession.cs | 26 -
.../Models/OperationLog.cs | 66 -
.../Models/ProductItem.cs | 19 -
.../Models/ProductItem2.cs | 25 -
.../Repositories/ICustomerRepository.cs | 10 -
.../Repositories/IOperationLogRepository.cs | 10 -
.../Repositories/IOrderRepository.cs | 10 -
.../Repositories/IProductRepository.cs | 15 -
.../UnitOfWorks/IPgSqlUnitOfWork.cs | 7 -
...ntityFrameworkCore.PostgreSql.Tests.csproj | 44 -
.../appsettings.json | 5 -
.../Filters/DeleteFilterTest.cs | 81 +
.../Filters/FilterManagerTest.cs | 101 +
.../Startup.cs | 54 +
.../Tests/CustomerRepositoryTest.cs | 604 ++
.../Tests/EntityEventsTest.cs | 211 +
.../Tests/OperationLogRepositoryTest.cs | 63 +
.../Tests/OrderRepositoryTest.cs | 130 +
.../Tests/PostRepositoryTest.cs | 54 +
.../Tests/ProductRepositoryTest.Queryable.cs | 390 +
.../Tests/ProductRepositoryTest.cs | 745 +-
.../Tests/TagRepositoryTest.cs | 41 +
...rkCore.SqlServer.Tests.Integration.csproj} | 38 +-
.../appsettings.Development.json} | 0
.../appsettings.json | 11 +
.../Conditions/ProductNameCondition.cs | 30 -
.../Util_Data_EF_Test_SqlServer.pdb | 7789 ----------------
.../Util_Data_EF_Test_SqlServer.pdm | 7792 -----------------
.../Fakes/CustomerFakeService.cs | 33 -
.../Fakes/OperationLogFakeService.cs | 27 -
.../Fakes/OrderItemFakeService.cs | 29 -
.../Fakes/ProductFakeService.cs | 31 -
.../Infrastructure/TestBase.cs | 18 -
.../Models/Customer.cs | 116 -
.../Models/Order.cs | 80 -
.../Models/OrderItem.cs | 71 -
.../Models/Product.cs | 149 -
.../Models/ProductEnum.cs | 9 -
.../Repositories/ICustomerRepository.cs | 10 -
.../Repositories/IProductRepository.cs | 15 -
.../UnitOfWorks/ISqlServerUnitOfWork.cs | 7 -
.../Filters/DeleteFilterTest.cs | 81 +
.../Filters/FilterManagerTest.cs | 101 +
.../Startup.cs | 53 +
.../Tests/CustomerRepositoryTest.cs | 604 ++
.../Tests/EntityEventsTest.cs | 211 +
.../Tests/OperationLogRepositoryTest.cs | 63 +
.../Tests/OrderRepositoryTest.cs | 130 +
.../Tests/PostRepositoryTest.cs | 54 +
.../Tests/ProductRepositoryTest.Queryable.cs | 390 +
.../Tests/ProductRepositoryTest.cs | 1408 +++
.../Tests/TagRepositoryTest.cs | 41 +
...meworkCore.Sqlite.Tests.Integration.csproj | 39 +
.../appsettings.Development.json | 11 +
.../appsettings.json | 11 +
.../Builders/Clauses/EndClauseTest.cs | 188 +
.../Builders/Clauses/FromClauseTest.cs | 187 +
.../Builders/Clauses/GroupByClauseTest.cs | 267 +
.../Builders/Clauses/InsertClauseTest.cs | 270 +
.../Builders/Clauses/JoinClauseTest.cs | 502 ++
.../Builders/Clauses/OrderByClauseTest.cs | 183 +
.../Builders/Clauses/SelectClauseTest.cs | 297 +
.../Builders/Clauses/StartClauseTest.cs | 187 +
.../Builders/Clauses/WhereClauseTest.cs | 595 ++
.../Builders/Conditions/AndConditionTest.cs | 103 +
.../Conditions/ContainsConditionTest.cs | 64 +
.../Builders/Conditions/EndsConditionTest.cs | 64 +
.../Builders/Conditions/EqualConditionTest.cs | 90 +
.../Conditions/ExistsConditionTest.cs | 43 +
.../Conditions/GreaterConditionTest.cs | 79 +
.../Conditions/GreaterEqualConditionTest.cs | 79 +
.../Builders/Conditions/InConditionTest.cs | 139 +
.../Conditions/IsNotNullConditionTest.cs | 37 +
.../Conditions/IsNullConditionTest.cs | 37 +
.../Builders/Conditions/LessConditionTest.cs | 79 +
.../Conditions/LessEqualConditionTest.cs | 79 +
.../Conditions/NotEqualConditionTest.cs | 89 +
.../Conditions/NotExistsConditionTest.cs | 43 +
.../Builders/Conditions/NotInConditionTest.cs | 139 +
.../Builders/Conditions/OrConditionTest.cs | 103 +
.../Conditions/SegmentConditionTest.cs | 119 +
.../Conditions/StartsConditionTest.cs | 64 +
.../Builders/Core/ColumnItemTest.cs | 164 +
.../Builders/Core/OrderByItemTest.cs | 105 +
.../Builders/Core/SplitItemTest.cs | 69 +
.../Builders/Core/SqlBuilderItemTest.cs | 43 +
.../Builders/Core/SqlConditionFactoryTest.cs | 186 +
.../Builders/Core/TableItemTest.cs | 135 +
.../Builders/Params/ParameterManagerTest.cs | 187 +
.../Builders/Sets/SqlBuilderSetTest.cs | 361 +
.../Builders/SqlBuilderTest.End.cs | 172 +
.../Builders/SqlBuilderTest.From.cs | 118 +
.../Builders/SqlBuilderTest.GroupBy.cs | 87 +
.../Builders/SqlBuilderTest.Insert.cs | 123 +
.../Builders/SqlBuilderTest.Join.cs | 357 +
.../Builders/SqlBuilderTest.OrderBy.cs | 82 +
.../Builders/SqlBuilderTest.Parameter.cs | 62 +
.../Builders/SqlBuilderTest.Select.cs | 180 +
.../Builders/SqlBuilderTest.Set.cs | 275 +
.../Builders/SqlBuilderTest.Start.cs | 152 +
.../Builders/SqlBuilderTest.Where.cs | 663 ++
.../Builders/SqlBuilderTest.cs | 27 +
.../Samples/TestColumnCache.cs | 49 +
.../Samples/TestDialect.cs | 41 +
.../Samples/TestDialect2.cs | 29 +
.../Samples/TestParameter.cs | 11 +
.../Samples/TestSqlBuilder.cs | 62 +
.../Util.Data.Sql.Tests.csproj | 25 +
.../Conditions/DateSegmentConditionTest.cs | 23 +-
.../DateTimeSegmentConditionTest.cs | 7 +
.../Conditions/DoubleSegmentConditionTest.cs | 2 +-
.../Conditions/IntSegmentConditionTest.cs | 2 +-
test/Util.Data.Tests/Util.Data.Tests.csproj | 6 +-
.../Util.Domain.Tests.csproj | 6 +-
test/Util.Events.Tests/Startup.cs | 8 +-
.../Util.Events.Tests.csproj | 12 +-
.../Properties/AssemblyInfo.cs | 2 +
.../ResourceTypes/Resource101.cs | 7 +
.../ResourceTypes/Resource102.cs | 7 +
.../ResourceTypes.Resource101.en-US.json | 3 +
.../ResourceTypes.Resource101.zh-CN.json | 3 +
.../ResourceTypes/Resource102.zh-CN.json | 3 +
.../Util.Localization.Resources.csproj | 36 +
.../Properties/AssemblyInfo.cs | 2 +
.../Properties/launchSettings.json | 12 +
.../ResourceTypes/Resource1.cs | 7 +
.../ResourceTypes/Resource2.cs | 7 +
.../ResourceTypes/Resource3.cs | 7 +
.../ResourceTypes/Resource4.cs | 14 +
.../ResourceTypes/Resource5.cs | 7 +
.../ResourceTypes/Resource6.cs | 7 +
.../ResourceTypes.Resource1.en-US.json | 3 +
.../ResourceTypes.Resource1.zh-CN.json | 3 +
.../ResourceTypes/Resource2.en-US.json | 3 +
.../ResourceTypes/Resource2.zh-CN.json | 5 +
.../ResourceTypes/Resource2.zh-Hans.json | 4 +
.../Resources/ResourceTypes/Resource2.zh.json | 4 +
.../ResourceTypes/Resource3.zh-Hans.json | 4 +
.../Resource4.Resource41.zh-CN.json | 4 +
.../Resources/ResourceTypes/Resource4.zh.json | 4 +
.../ResourceTypes/Resource5.zh-CN.json | 4 +
.../ResourceTypes/Resource5.zh-Hans.json | 4 +
.../Resources/ResourceTypes/Resource5.zh.json | 4 +
.../Resources/zh.json | 4 +
.../Startup.cs | 54 +
.../Tests/JsonStringLocalizerFactoryTest.cs | 110 +
.../Tests/PathResolverTest.cs | 118 +
.../Tests/StringLocalizerTest.cs | 232 +
...Util.Localization.Tests.Integration.csproj | 34 +
.../LogContextAccessor.cs | 0
.../LogTest.cs | 4 +-
.../Samples/Product.cs | 0
.../Startup.cs | 13 +-
...og.Exceptionless.Tests.Integration.csproj} | 17 +-
.../appsettings.Production.json | 13 +
.../appsettings.json | 4 +-
.../LogContextAccessor.cs | 2 +-
.../LogTest.cs | 0
.../Samples/Product.cs | 2 +-
.../Startup.cs | 6 +-
....Logging.Serilog.Tests.Integration.csproj} | 12 +-
.../appsettings.json | 0
test/Util.Logging.Tests/LogTest.Trace .cs | 3 +-
.../Util.Logging.Tests.csproj | 8 +-
.../Startup.cs | 8 +-
...Util.ObjectMapping.AutoMapper.Tests.csproj | 14 +-
.../Startup.cs | 8 +-
.../Util.Templates.Handlebars.Tests.csproj | 12 +-
test/Util.Templates.Razor.Tests/Startup.cs | 8 +-
.../Util.Templates.Razor.Tests.csproj | 12 +-
.../CustomerConfiguration.cs | 24 +-
.../OperationLogConfiguration.cs | 55 +
.../OrderConfiguration.cs | 65 +
.../OrderItemConfiguration.cs | 70 +
.../PostConfiguration.cs | 63 +
.../ProductConfiguration.cs | 42 +-
.../TagConfiguration.cs | 57 +
.../Repositories/CustomerRepository.cs | 8 +-
.../Repositories/OperationLogRepository.cs | 9 +-
.../Repositories/OrderRepository.cs | 9 +-
.../Repositories/PostRepository.cs | 9 +-
.../Repositories/ProductRepository.cs | 8 +-
.../Repositories/TagRepository.cs | 9 +-
.../UnitOfWorks/MySqlUnitOfWork.cs | 26 +
.../Util.TestShare.MySql.csproj | 13 +
.../CustomerConfiguration.cs | 94 +
.../OperationLogConfiguration.cs | 55 +
.../OrderConfiguration.cs | 65 +
.../OrderItemConfiguration.cs | 70 +
.../PostConfiguration.cs | 63 +
.../ProductConfiguration.cs | 40 +-
.../TagConfiguration.cs | 57 +
.../Repositories/CustomerRepository.cs | 8 +-
.../Repositories/OperationLogRepository.cs | 9 +-
.../Repositories/OrderRepository.cs | 9 +-
.../Repositories/PostRepository.cs | 17 +
.../Repositories/ProductRepository.cs | 8 +-
.../Repositories/TagRepository.cs | 17 +
.../UnitOfWorks/OracleUnitOfWork.cs | 26 +
.../Util.TestShare.Oracle.csproj | 13 +
.../CustomerConfiguration.cs | 23 +-
.../OperationLogConfiguration.cs | 4 +-
.../OrderConfiguration.cs | 16 +-
.../OrderItemConfiguration.cs | 7 +-
.../PostConfiguration.cs | 6 +-
.../ProductConfiguration.cs | 42 +-
.../TagConfiguration.cs | 6 +-
.../Repositories/CustomerRepository.cs | 9 +-
.../Repositories/OperationLogRepository.cs | 17 +
.../Repositories/OrderRepository.cs | 17 +
.../Repositories/PostRepository.cs | 17 +
.../Repositories/ProductRepository.cs | 9 +-
.../Repositories/TagRepository.cs | 17 +
.../UnitOfWorks/PgSqlUnitOfWork.cs | 5 +-
.../Util.TestShare.PostgreSql.csproj | 13 +
.../CustomerConfiguration.cs | 23 +-
.../OperationLogConfiguration.cs | 5 +-
.../OrderConfiguration.cs | 17 +-
.../OrderItemConfiguration.cs | 7 +-
.../PostConfiguration.cs | 63 +
.../ProductConfiguration.cs | 42 +-
.../TagConfiguration.cs | 57 +
.../Repositories/CustomerRepository.cs | 9 +-
.../Repositories/OperationLogRepository.cs | 17 +
.../Repositories/OrderRepository.cs | 17 +
.../Repositories/PostRepository.cs | 17 +
.../Repositories/ProductRepository.cs | 9 +-
.../Repositories/TagRepository.cs | 17 +
.../UnitOfWorks/SqlServerUnitOfWork.cs | 5 +-
.../Util.TestShare.SqlServer.csproj | 14 +
.../CustomerConfiguration.cs | 21 +-
.../OperationLogConfiguration.cs | 55 +
.../OrderConfiguration.cs | 65 +
.../OrderItemConfiguration.cs | 70 +
.../PostConfiguration.cs | 63 +
.../ProductConfiguration.cs | 102 +
.../TagConfiguration.cs | 57 +
.../Repositories/CustomerRepository.cs | 17 +
.../Repositories/OperationLogRepository.cs | 17 +
.../Repositories/OrderRepository.cs | 17 +
.../Repositories/PostRepository.cs | 17 +
.../Repositories/ProductRepository.cs | 25 +
.../Repositories/TagRepository.cs | 17 +
.../UnitOfWorks/SqliteUnitOfWork.cs | 26 +
.../Util.TestShare.Sqlite.csproj | 13 +
.../Conditions/ProductNameCondition.cs | 5 +-
test/Util.TestShare/Configs/TestConfig.cs | 49 +
.../Controllers/CustomerController.cs | 9 +-
.../Controllers/ProductController.cs | 9 +-
.../Dtos/CustomerDto.cs | 3 +-
.../Dtos/ProductDto.cs | 5 +-
.../OperationLogChangedEventHandler.cs | 12 +-
.../OperationLogDeletedEventHandler.cs | 12 +-
.../ProductChangedEventHandler.cs | 15 +-
.../ProductCreatedEventHandler.cs | 12 +-
.../ProductDeletedEventHandler.cs | 12 +-
.../ProductUpdatedEventHandler.cs | 12 +-
.../Fakes/CustomerFakeService.cs | 11 +-
.../Fakes/OperationLogFakeService.cs | 5 +-
.../Fakes/OrderFakeService.cs | 4 +-
.../Fakes/OrderItemFakeService.cs | 5 +-
.../Fakes/PostFakeService.cs | 4 +-
.../Fakes/ProductFakeService.cs | 13 +-
.../Fakes/TagFakeService.cs | 4 +-
.../Infrastructure/ControllerTestBase.cs} | 8 +-
.../Infrastructure/TestBase.cs | 2 +-
.../Infrastructure/TestSession.cs | 2 +-
.../Infrastructure/WebApiResult.cs | 4 +-
.../Models/Customer.cs | 5 +-
.../Models/OperationLog.cs | 2 +-
.../Models/Order.cs | 5 +-
.../Models/OrderItem.cs | 3 +-
.../Models/Post.cs | 2 +-
.../Models/Product.cs | 17 +-
.../Models/ProductEnum.cs | 2 +-
.../Models/ProductItem.cs | 2 +-
.../Models/ProductItem2.cs | 2 +-
.../Models/Tag.cs | 2 +-
.../Queries/CustomerQuery.cs | 2 +-
.../Queries/ProductQuery.cs | 2 +-
.../Repositories/ICustomerRepository.cs | 4 +-
.../Repositories/IOperationLogRepository.cs | 4 +-
.../Repositories/IOrderRepository.cs | 4 +-
.../Repositories/IPostRepository.cs | 4 +-
.../Repositories/IProductRepository.cs | 4 +-
.../Repositories/ITagRepository.cs | 4 +-
.../Services/CustomerQueryService.cs | 11 +-
.../Services/CustomerService.cs | 15 +-
.../Services/ICustomerQueryService.cs | 7 +-
.../Services/ICustomerService.cs | 7 +-
.../Services/IProductService.cs | 7 +-
.../Services/ProductService.cs | 15 +-
.../UnitOfWorks/ITestUnitOfWork.cs | 9 +
test/Util.TestShare/Util.TestShare.csproj | 14 +
test/Util.Validation.Tests/Startup.cs | 10 +-
.../Util.Validation.Tests.csproj | 12 +-
785 files changed, 47506 insertions(+), 20706 deletions(-)
create mode 100644 sample/Util.WebApi.Sample/Program.cs
create mode 100644 sample/Util.WebApi.Sample/Properties/AssemblyInfo.cs
create mode 100644 sample/Util.WebApi.Sample/Properties/launchSettings.json
create mode 100644 sample/Util.WebApi.Sample/Util.WebApi.Sample.csproj
create mode 100644 sample/Util.WebApi.Sample/appsettings.Development.json
create mode 100644 sample/Util.WebApi.Sample/appsettings.json
create mode 100644 solutions/Util.Data.slnf
create mode 100644 solutions/Util.Localization.slnf
rename src/Util.Aop.AspectCore/{04-Util.Aop.AspectCore.csproj => 03-Util.Aop.AspectCore.csproj} (100%)
delete mode 100644 src/Util.Aop.AspectCore/HostBuilderExtensions.cs
delete mode 100644 src/Util.Aop.AspectCore/ServiceCollectionExtensions.cs
create mode 100644 src/Util.Application.WebApi/IResultFactory.cs
rename src/Util.AspNetCore/{02-Util.AspNetCore.csproj => 07-Util.AspNetCore.csproj} (100%)
create mode 100644 src/Util.AspNetCore/Security/DataProtectionEncryptor.cs
create mode 100644 src/Util.Core/Configs/OptionsExtensionBase.cs
create mode 100644 src/Util.Core/Configs/PreOptions.cs
create mode 100644 src/Util.Core/Dates/OptionsExtensions.cs
create mode 100644 src/Util.Core/Dates/TimeOptions.cs
create mode 100644 src/Util.Core/Helpers/Culture.cs
create mode 100644 src/Util.Core/Helpers/Environment.cs
create mode 100644 src/Util.Core/HostBuilderExtensions.cs
delete mode 100644 src/Util.Core/Properties/UtilCoreResource.Designer.cs
create mode 100644 src/Util.Core/Security/IEncryptor.cs
create mode 100644 src/Util.Core/Security/NullEncryptor.cs
create mode 100644 src/Util.Core/SystemTextJson/DateTimeJsonConverter.cs
create mode 100644 src/Util.Core/SystemTextJson/NullableDateTimeJsonConverter.cs
create mode 100644 src/Util.Data.Dapper.All/05-Util.Data.Dapper.All.csproj
create mode 100644 src/Util.Data.Dapper.All/Infrastructure/DapperServiceRegistrar.cs
create mode 100644 src/Util.Data.Dapper.All/Infrastructure/ServiceRegistrarConfigExtensions.cs
create mode 100644 src/Util.Data.Dapper.All/Metadata/MetadataServiceFactory.cs
create mode 100644 src/Util.Data.Dapper.All/Metadata/TypeConverterFactory.cs
create mode 100644 src/Util.Data.Dapper.Core/01-Util.Data.Dapper.Core.csproj
create mode 100644 src/Util.Data.Dapper.Core/Properties/UtilDataDapperResource.Designer.cs
rename src/{Util.Core/Properties/UtilCoreResource.resx => Util.Data.Dapper.Core/Properties/UtilDataDapperResource.resx} (83%)
create mode 100644 src/Util.Data.Dapper.Core/Sql/SqlExecutorBase.cs
create mode 100644 src/Util.Data.Dapper.Core/Sql/SqlQueryBase.cs
create mode 100644 src/Util.Data.Dapper.MySql/04-Util.Data.Dapper.MySql.csproj
create mode 100644 src/Util.Data.Dapper.MySql/Metadata/MySqlMetadataService.cs
create mode 100644 src/Util.Data.Dapper.MySql/Metadata/MySqlTypeConverter.cs
create mode 100644 src/Util.Data.Dapper.MySql/Sql/Builders/MySqlBuilder.cs
create mode 100644 src/Util.Data.Dapper.MySql/Sql/Builders/MySqlColumnCache.cs
create mode 100644 src/Util.Data.Dapper.MySql/Sql/Builders/MySqlDialect.cs
create mode 100644 src/Util.Data.Dapper.MySql/Sql/Builders/MySqlExistsSqlBuilder.cs
create mode 100644 src/Util.Data.Dapper.MySql/Sql/MySqlDatabaseFactory.cs
create mode 100644 src/Util.Data.Dapper.MySql/Sql/MySqlExecutor.cs
create mode 100644 src/Util.Data.Dapper.MySql/Sql/MySqlExecutorBase.cs
create mode 100644 src/Util.Data.Dapper.MySql/Sql/MySqlExecutorOptionsExtension.cs
create mode 100644 src/Util.Data.Dapper.MySql/Sql/MySqlQuery.cs
create mode 100644 src/Util.Data.Dapper.MySql/Sql/MySqlQueryBase.cs
create mode 100644 src/Util.Data.Dapper.MySql/Sql/MySqlQueryOptionsExtension.cs
create mode 100644 src/Util.Data.Dapper.MySql/Sql/OptionsExtensions.cs
create mode 100644 src/Util.Data.Dapper.PostgreSql/03-Util.Data.Dapper.PostgreSql.csproj
create mode 100644 src/Util.Data.Dapper.PostgreSql/Metadata/PostgreSqlMetadataService.cs
create mode 100644 src/Util.Data.Dapper.PostgreSql/Metadata/PostgreSqlTypeConverter.cs
create mode 100644 src/Util.Data.Dapper.PostgreSql/Sql/Builders/PostgreSqlBuilder.cs
create mode 100644 src/Util.Data.Dapper.PostgreSql/Sql/Builders/PostgreSqlColumnCache.cs
create mode 100644 src/Util.Data.Dapper.PostgreSql/Sql/Builders/PostgreSqlDialect.cs
create mode 100644 src/Util.Data.Dapper.PostgreSql/Sql/Builders/PostgreSqlExistsSqlBuilder.cs
create mode 100644 src/Util.Data.Dapper.PostgreSql/Sql/OptionsExtensions.cs
create mode 100644 src/Util.Data.Dapper.PostgreSql/Sql/PostgreSqlDatabaseFactory.cs
create mode 100644 src/Util.Data.Dapper.PostgreSql/Sql/PostgreSqlExecutor.cs
create mode 100644 src/Util.Data.Dapper.PostgreSql/Sql/PostgreSqlExecutorBase.cs
create mode 100644 src/Util.Data.Dapper.PostgreSql/Sql/PostgreSqlExecutorOptionsExtension.cs
create mode 100644 src/Util.Data.Dapper.PostgreSql/Sql/PostgreSqlQuery.cs
create mode 100644 src/Util.Data.Dapper.PostgreSql/Sql/PostgreSqlQueryBase.cs
create mode 100644 src/Util.Data.Dapper.PostgreSql/Sql/PostgreSqlQueryOptionsExtension.cs
create mode 100644 src/Util.Data.Dapper.SqlServer/02-Util.Data.Dapper.SqlServer.csproj
create mode 100644 src/Util.Data.Dapper.SqlServer/Metadata/SqlServerMetadataService.cs
create mode 100644 src/Util.Data.Dapper.SqlServer/Metadata/SqlServerTypeConverter.cs
create mode 100644 src/Util.Data.Dapper.SqlServer/Sql/Builders/SqlServerBuilder.cs
create mode 100644 src/Util.Data.Dapper.SqlServer/Sql/Builders/SqlServerColumnCache.cs
create mode 100644 src/Util.Data.Dapper.SqlServer/Sql/Builders/SqlServerDialect.cs
create mode 100644 src/Util.Data.Dapper.SqlServer/Sql/Builders/SqlServerExistsSqlBuilder.cs
create mode 100644 src/Util.Data.Dapper.SqlServer/Sql/OptionsExtensions.cs
create mode 100644 src/Util.Data.Dapper.SqlServer/Sql/SqlServerDatabaseFactory.cs
create mode 100644 src/Util.Data.Dapper.SqlServer/Sql/SqlServerSqlExecutor.cs
create mode 100644 src/Util.Data.Dapper.SqlServer/Sql/SqlServerSqlExecutorBase.cs
create mode 100644 src/Util.Data.Dapper.SqlServer/Sql/SqlServerSqlExecutorOptionsExtension.cs
create mode 100644 src/Util.Data.Dapper.SqlServer/Sql/SqlServerSqlQuery.cs
create mode 100644 src/Util.Data.Dapper.SqlServer/Sql/SqlServerSqlQueryBase.cs
create mode 100644 src/Util.Data.Dapper.SqlServer/Sql/SqlServerSqlQueryOptionsExtension.cs
create mode 100644 src/Util.Data.EntityFrameworkCore.MySql/04-Util.Data.EntityFrameworkCore.MySql.csproj
create mode 100644 src/Util.Data.EntityFrameworkCore.MySql/MySqlOptionsExtension.cs
create mode 100644 src/Util.Data.EntityFrameworkCore.MySql/MySqlUnitOfWorkBase.cs
create mode 100644 src/Util.Data.EntityFrameworkCore.MySql/OptionsExtensions.cs
create mode 100644 src/Util.Data.EntityFrameworkCore.Oracle/06-Util.Data.EntityFrameworkCore.Oracle.csproj
create mode 100644 src/Util.Data.EntityFrameworkCore.Oracle/OptionsExtensions.cs
create mode 100644 src/Util.Data.EntityFrameworkCore.Oracle/OracleOptionsExtension.cs
create mode 100644 src/Util.Data.EntityFrameworkCore.Oracle/OracleUnitOfWorkBase.cs
create mode 100644 src/Util.Data.EntityFrameworkCore.Sqlite/05-Util.Data.EntityFrameworkCore.Sqlite.csproj
create mode 100644 src/Util.Data.EntityFrameworkCore.Sqlite/OptionsExtensions.cs
create mode 100644 src/Util.Data.EntityFrameworkCore.Sqlite/SqliteOptionsExtension.cs
create mode 100644 src/Util.Data.EntityFrameworkCore.Sqlite/SqliteUnitOfWorkBase.cs
create mode 100644 src/Util.Data.EntityFrameworkCore/ValueConverters/DateTimeValueConverter.cs
create mode 100644 src/Util.Data.Metadata/03-Util.Data.Metadata.csproj
create mode 100644 src/Util.Data.Metadata/ColumnInfo.cs
create mode 100644 src/Util.Data.Metadata/DatabaseInfo.cs
create mode 100644 src/Util.Data.Metadata/IMetadataService.cs
create mode 100644 src/Util.Data.Metadata/IMetadataServiceFactory.cs
create mode 100644 src/Util.Data.Metadata/ITypeConverter.cs
create mode 100644 src/Util.Data.Metadata/ITypeConverterFactory.cs
create mode 100644 src/Util.Data.Metadata/TableInfo.cs
create mode 100644 src/Util.Data.Sql/02-Util.Data.Sql.csproj
create mode 100644 src/Util.Data.Sql/Builders/Caches/ColumnCacheBase.cs
create mode 100644 src/Util.Data.Sql/Builders/Caches/IColumnCache.cs
create mode 100644 src/Util.Data.Sql/Builders/Clauses/ClauseBase.cs
create mode 100644 src/Util.Data.Sql/Builders/Clauses/EndClause.cs
create mode 100644 src/Util.Data.Sql/Builders/Clauses/FromClause.cs
create mode 100644 src/Util.Data.Sql/Builders/Clauses/GroupByClause.cs
create mode 100644 src/Util.Data.Sql/Builders/Clauses/IEndClause.cs
create mode 100644 src/Util.Data.Sql/Builders/Clauses/IFromClause.cs
create mode 100644 src/Util.Data.Sql/Builders/Clauses/IGroupByClause.cs
create mode 100644 src/Util.Data.Sql/Builders/Clauses/IInsertClause.cs
create mode 100644 src/Util.Data.Sql/Builders/Clauses/IJoinClause.cs
create mode 100644 src/Util.Data.Sql/Builders/Clauses/IOrderByClause.cs
create mode 100644 src/Util.Data.Sql/Builders/Clauses/ISelectClause.cs
create mode 100644 src/Util.Data.Sql/Builders/Clauses/ISqlClause.cs
create mode 100644 src/Util.Data.Sql/Builders/Clauses/IStartClause.cs
create mode 100644 src/Util.Data.Sql/Builders/Clauses/IWhereClause.cs
create mode 100644 src/Util.Data.Sql/Builders/Clauses/InsertClause.cs
create mode 100644 src/Util.Data.Sql/Builders/Clauses/JoinClause.cs
create mode 100644 src/Util.Data.Sql/Builders/Clauses/OrderByClause.cs
create mode 100644 src/Util.Data.Sql/Builders/Clauses/SelectClause.cs
create mode 100644 src/Util.Data.Sql/Builders/Clauses/StartClause.cs
create mode 100644 src/Util.Data.Sql/Builders/Clauses/WhereClause.cs
create mode 100644 src/Util.Data.Sql/Builders/Conditions/AndCondition.cs
create mode 100644 src/Util.Data.Sql/Builders/Conditions/ContainsCondition.cs
create mode 100644 src/Util.Data.Sql/Builders/Conditions/EndsCondition.cs
create mode 100644 src/Util.Data.Sql/Builders/Conditions/EqualCondition.cs
create mode 100644 src/Util.Data.Sql/Builders/Conditions/ExistsCondition.cs
create mode 100644 src/Util.Data.Sql/Builders/Conditions/GreaterCondition.cs
create mode 100644 src/Util.Data.Sql/Builders/Conditions/GreaterEqualCondition.cs
create mode 100644 src/Util.Data.Sql/Builders/Conditions/InCondition.cs
create mode 100644 src/Util.Data.Sql/Builders/Conditions/IsNotNullCondition.cs
create mode 100644 src/Util.Data.Sql/Builders/Conditions/IsNullCondition.cs
create mode 100644 src/Util.Data.Sql/Builders/Conditions/LessCondition.cs
create mode 100644 src/Util.Data.Sql/Builders/Conditions/LessEqualCondition.cs
create mode 100644 src/Util.Data.Sql/Builders/Conditions/NotEqualCondition.cs
create mode 100644 src/Util.Data.Sql/Builders/Conditions/NotExistsCondition.cs
create mode 100644 src/Util.Data.Sql/Builders/Conditions/NotInCondition.cs
create mode 100644 src/Util.Data.Sql/Builders/Conditions/NullCondition.cs
create mode 100644 src/Util.Data.Sql/Builders/Conditions/OrCondition.cs
create mode 100644 src/Util.Data.Sql/Builders/Conditions/SegmentCondition.cs
create mode 100644 src/Util.Data.Sql/Builders/Conditions/SqlCondition.cs
create mode 100644 src/Util.Data.Sql/Builders/Conditions/SqlConditionBase.cs
create mode 100644 src/Util.Data.Sql/Builders/Conditions/StartsCondition.cs
create mode 100644 src/Util.Data.Sql/Builders/Core/ColumnItem.cs
create mode 100644 src/Util.Data.Sql/Builders/Core/CteItem.cs
create mode 100644 src/Util.Data.Sql/Builders/Core/DialectBase.cs
create mode 100644 src/Util.Data.Sql/Builders/Core/NameItem.cs
create mode 100644 src/Util.Data.Sql/Builders/Core/OrderByItem.cs
create mode 100644 src/Util.Data.Sql/Builders/Core/SplitItem.cs
create mode 100644 src/Util.Data.Sql/Builders/Core/SqlBuilderItem.cs
create mode 100644 src/Util.Data.Sql/Builders/Core/TableItem.cs
create mode 100644 src/Util.Data.Sql/Builders/IConditionFactory.cs
create mode 100644 src/Util.Data.Sql/Builders/IDialect.cs
create mode 100644 src/Util.Data.Sql/Builders/IExistsSqlBuilder.cs
create mode 100644 src/Util.Data.Sql/Builders/ISqlContent.cs
create mode 100644 src/Util.Data.Sql/Builders/ISqlPartAccessor.cs
create mode 100644 src/Util.Data.Sql/Builders/Operations/IEnd.cs
create mode 100644 src/Util.Data.Sql/Builders/Operations/IFrom.cs
create mode 100644 src/Util.Data.Sql/Builders/Operations/IGroupBy.cs
create mode 100644 src/Util.Data.Sql/Builders/Operations/IInsert.cs
create mode 100644 src/Util.Data.Sql/Builders/Operations/IJoin.cs
create mode 100644 src/Util.Data.Sql/Builders/Operations/IOrderBy.cs
create mode 100644 src/Util.Data.Sql/Builders/Operations/ISelect.cs
create mode 100644 src/Util.Data.Sql/Builders/Operations/ISet.cs
create mode 100644 src/Util.Data.Sql/Builders/Operations/ISqlOperation.cs
create mode 100644 src/Util.Data.Sql/Builders/Operations/ISqlParameter.cs
create mode 100644 src/Util.Data.Sql/Builders/Operations/ISqlQueryOperation.cs
create mode 100644 src/Util.Data.Sql/Builders/Operations/IStart.cs
create mode 100644 src/Util.Data.Sql/Builders/Operations/IWhere.cs
create mode 100644 src/Util.Data.Sql/Builders/Params/IClearParameters.cs
create mode 100644 src/Util.Data.Sql/Builders/Params/IGetParameter.cs
create mode 100644 src/Util.Data.Sql/Builders/Params/IParamLiteralsResolver.cs
create mode 100644 src/Util.Data.Sql/Builders/Params/IParameterManager.cs
create mode 100644 src/Util.Data.Sql/Builders/Params/ParamLiteralsResolver.cs
create mode 100644 src/Util.Data.Sql/Builders/Params/ParameterManager.cs
create mode 100644 src/Util.Data.Sql/Builders/Params/SqlParam.cs
create mode 100644 src/Util.Data.Sql/Builders/Sets/ISqlBuilderSet.cs
create mode 100644 src/Util.Data.Sql/Builders/Sets/SqlBuilderSet.cs
create mode 100644 src/Util.Data.Sql/Builders/Sets/SqlBuilderSetItem.cs
create mode 100644 src/Util.Data.Sql/Builders/SqlBuilderBase.cs
create mode 100644 src/Util.Data.Sql/Builders/SqlBuilderResult.cs
create mode 100644 src/Util.Data.Sql/Builders/SqlConditionFactory.cs
create mode 100644 src/Util.Data.Sql/Configs/ISqlOptions.cs
create mode 100644 src/Util.Data.Sql/Configs/ISqlOptionsAccessor.cs
create mode 100644 src/Util.Data.Sql/Database/IConnectionManager.cs
create mode 100644 src/Util.Data.Sql/Database/ITransactionManager.cs
create mode 100644 src/Util.Data.Sql/EndClauseExtensions.cs
create mode 100644 src/Util.Data.Sql/FromClauseExtensions.cs
create mode 100644 src/Util.Data.Sql/GroupByClauseExtensions.cs
create mode 100644 src/Util.Data.Sql/ISqlBuilder.cs
create mode 100644 src/Util.Data.Sql/ISqlCondition.cs
create mode 100644 src/Util.Data.Sql/ISqlExecutor.cs
create mode 100644 src/Util.Data.Sql/ISqlQuery.cs
create mode 100644 src/Util.Data.Sql/InsertClauseExtensions.cs
create mode 100644 src/Util.Data.Sql/JoinClauseExtensions.cs
create mode 100644 src/Util.Data.Sql/OrderByClauseExtensions.cs
create mode 100644 src/Util.Data.Sql/ParameterExtensions.cs
create mode 100644 src/Util.Data.Sql/SelectClauseExtensions.cs
create mode 100644 src/Util.Data.Sql/SqlBuilderSetExtensions.cs
create mode 100644 src/Util.Data.Sql/SqlExecutorExtensions.cs
create mode 100644 src/Util.Data.Sql/SqlOptions.cs
create mode 100644 src/Util.Data.Sql/SqlOptionsExtensions.cs
create mode 100644 src/Util.Data.Sql/SqlQueryExtensions.Query.cs
create mode 100644 src/Util.Data.Sql/SqlQueryExtensions.Scalar.cs
create mode 100644 src/Util.Data.Sql/SqlQueryExtensions.cs
create mode 100644 src/Util.Data.Sql/StartClauseExtensions.cs
create mode 100644 src/Util.Data.Sql/WhereClauseExtensions.cs
create mode 100644 src/Util.Localization/04-Util.Localization.csproj
create mode 100644 src/Util.Localization/Json/IPathResolver.cs
create mode 100644 src/Util.Localization/Json/JsonStringLocalizer.cs
create mode 100644 src/Util.Localization/Json/JsonStringLocalizerFactory.cs
create mode 100644 src/Util.Localization/Json/JsonStringLocalizerLoggerExtensions.cs
create mode 100644 src/Util.Localization/Json/PathResolver.cs
create mode 100644 src/Util.Localization/Json/StringLocalizer.cs
create mode 100644 src/Util.Localization/JsonLocalizationOptionsExtension.cs
create mode 100644 src/Util.Localization/OptionsExtensions.cs
create mode 100644 src/Util.Logging/NullLog.cs
rename src/Util.ObjectMapping.AutoMapper/{03-Util.ObjectMapping.AutoMapper.csproj => 02-Util.ObjectMapping.AutoMapper.csproj} (94%)
create mode 100644 test/Util.Application.EntityFrameworkCore.MySql.Tests.Integration/Startup.cs
create mode 100644 test/Util.Application.EntityFrameworkCore.MySql.Tests.Integration/Tests/CustomerQueryServiceTest.cs
create mode 100644 test/Util.Application.EntityFrameworkCore.MySql.Tests.Integration/Tests/CustomerServiceTest.cs
create mode 100644 test/Util.Application.EntityFrameworkCore.MySql.Tests.Integration/Tests/ProductServiceTest.cs
create mode 100644 test/Util.Application.EntityFrameworkCore.MySql.Tests.Integration/Util.Application.EntityFrameworkCore.MySql.Tests.Integration.csproj
create mode 100644 test/Util.Application.EntityFrameworkCore.MySql.Tests.Integration/appsettings.Development.json
create mode 100644 test/Util.Application.EntityFrameworkCore.MySql.Tests.Integration/appsettings.json
create mode 100644 test/Util.Application.EntityFrameworkCore.PostgreSql.Tests.Integration/Startup.cs
create mode 100644 test/Util.Application.EntityFrameworkCore.PostgreSql.Tests.Integration/Tests/CustomerQueryServiceTest.cs
create mode 100644 test/Util.Application.EntityFrameworkCore.PostgreSql.Tests.Integration/Tests/CustomerServiceTest.cs
create mode 100644 test/Util.Application.EntityFrameworkCore.PostgreSql.Tests.Integration/Tests/ProductServiceTest.cs
create mode 100644 test/Util.Application.EntityFrameworkCore.PostgreSql.Tests.Integration/Util.Application.EntityFrameworkCore.PostgreSql.Tests.Integration.csproj
create mode 100644 test/Util.Application.EntityFrameworkCore.PostgreSql.Tests.Integration/appsettings.Development.json
create mode 100644 test/Util.Application.EntityFrameworkCore.PostgreSql.Tests.Integration/appsettings.json
delete mode 100644 test/Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration/Models/Customer.cs
delete mode 100644 test/Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration/Models/Product.cs
delete mode 100644 test/Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration/Models/ProductItem.cs
delete mode 100644 test/Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration/Models/ProductItem2.cs
delete mode 100644 test/Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration/Repositories/ICustomerRepository.cs
delete mode 100644 test/Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration/Services/CustomerService.cs
delete mode 100644 test/Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration/Services/ICustomerService.cs
delete mode 100644 test/Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration/Services/IProductService.cs
delete mode 100644 test/Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration/UnitOfWorks/ISqlServerUnitOfWork.cs
delete mode 100644 test/Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration/UnitOfWorks/SqlServerUnitOfWork.cs
create mode 100644 test/Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration/appsettings.Development.json
create mode 100644 test/Util.Application.WebApi.MySql.Tests.Integration/Properties/launchSettings.json
rename test/{Util.Application.WebApi.Tests.Integration => Util.Application.WebApi.MySql.Tests.Integration}/Startup.cs (78%)
rename test/{Util.Application.WebApi.Tests.Integration => Util.Application.WebApi.MySql.Tests.Integration}/Tests/CustomerControllerTest.cs (88%)
rename test/{Util.Application.WebApi.Tests.Integration => Util.Application.WebApi.MySql.Tests.Integration}/Tests/ProductControllerTest.cs (95%)
create mode 100644 test/Util.Application.WebApi.MySql.Tests.Integration/Util.Application.WebApi.MySql.Tests.Integration.csproj
create mode 100644 test/Util.Application.WebApi.MySql.Tests.Integration/appsettings.Development.json
create mode 100644 test/Util.Application.WebApi.MySql.Tests.Integration/appsettings.json
create mode 100644 test/Util.Application.WebApi.PostgreSql.Tests.Integration/Properties/launchSettings.json
create mode 100644 test/Util.Application.WebApi.PostgreSql.Tests.Integration/Startup.cs
create mode 100644 test/Util.Application.WebApi.PostgreSql.Tests.Integration/Tests/CustomerControllerTest.cs
create mode 100644 test/Util.Application.WebApi.PostgreSql.Tests.Integration/Tests/ProductControllerTest.cs
create mode 100644 test/Util.Application.WebApi.PostgreSql.Tests.Integration/Util.Application.WebApi.PostgreSql.Tests.Integration.csproj
create mode 100644 test/Util.Application.WebApi.PostgreSql.Tests.Integration/appsettings.Development.json
create mode 100644 test/Util.Application.WebApi.PostgreSql.Tests.Integration/appsettings.json
rename test/{Util.Application.WebApi.Tests.Integration => Util.Application.WebApi.SqlServer.Tests.Integration}/Properties/launchSettings.json (100%)
create mode 100644 test/Util.Application.WebApi.SqlServer.Tests.Integration/Startup.cs
create mode 100644 test/Util.Application.WebApi.SqlServer.Tests.Integration/Tests/CustomerControllerTest.cs
create mode 100644 test/Util.Application.WebApi.SqlServer.Tests.Integration/Tests/ProductControllerTest.cs
rename test/{Util.Application.WebApi.Tests.Integration/Util.Application.WebApi.Tests.Integration.csproj => Util.Application.WebApi.SqlServer.Tests.Integration/Util.Application.WebApi.SqlServer.Tests.Integration.csproj} (68%)
rename test/{Util.Application.WebApi.Tests.Integration/appsettings.json => Util.Application.WebApi.SqlServer.Tests.Integration/appsettings.Development.json} (58%)
create mode 100644 test/Util.Application.WebApi.SqlServer.Tests.Integration/appsettings.json
delete mode 100644 test/Util.Application.WebApi.Tests.Integration/Dtos/CustomerDto.cs
delete mode 100644 test/Util.Application.WebApi.Tests.Integration/Dtos/ProductDto.cs
delete mode 100644 test/Util.Application.WebApi.Tests.Integration/Fakes/CustomerFakeService.cs
delete mode 100644 test/Util.Application.WebApi.Tests.Integration/Fakes/ProductFakeService.cs
delete mode 100644 test/Util.Application.WebApi.Tests.Integration/Models/Customer.cs
delete mode 100644 test/Util.Application.WebApi.Tests.Integration/Models/Product.cs
delete mode 100644 test/Util.Application.WebApi.Tests.Integration/Queries/CustomerQuery.cs
delete mode 100644 test/Util.Application.WebApi.Tests.Integration/Queries/ProductQuery.cs
delete mode 100644 test/Util.Application.WebApi.Tests.Integration/Repositories/IProductRepository.cs
delete mode 100644 test/Util.Application.WebApi.Tests.Integration/Services/ProductService.cs
delete mode 100644 test/Util.Application.WebApi.Tests.Integration/UnitOfWorks/ISqlServerUnitOfWork.cs
delete mode 100644 test/Util.Application.WebApi.Tests.Integration/UnitOfWorks/SqlServerUnitOfWork.cs
create mode 100644 test/Util.AspNetCore.Tests/Samples/Certificate/apiclient_cert.p12
create mode 100644 test/Util.AspNetCore.Tests/Samples/Certificate/apiclient_cert.pem
create mode 100644 test/Util.AspNetCore.Tests/Samples/Certificate/apiclient_key.pem
delete mode 100644 test/Util.Core.Tests.Integration/appsettings2.json
create mode 100644 test/Util.Core.Tests/Helpers/CultureTest.cs
create mode 100644 test/Util.Data.Dapper.MySql.Tests.Integration/Infrastructure/DatabaseScript.cs
create mode 100644 test/Util.Data.Dapper.MySql.Tests.Integration/Metadata/MySqlMetadataServiceTest.cs
create mode 100644 test/Util.Data.Dapper.MySql.Tests.Integration/SqlBuilders/MySqlExistsSqlBuilderTest.cs
create mode 100644 test/Util.Data.Dapper.MySql.Tests.Integration/SqlExecutor/MySqlExecutorTest.Execute.cs
create mode 100644 test/Util.Data.Dapper.MySql.Tests.Integration/SqlExecutor/MySqlExecutorTest.Id.cs
create mode 100644 test/Util.Data.Dapper.MySql.Tests.Integration/SqlExecutor/MySqlExecutorTest.Insert.cs
create mode 100644 test/Util.Data.Dapper.MySql.Tests.Integration/SqlExecutor/MySqlExecutorTest.Param.cs
create mode 100644 test/Util.Data.Dapper.MySql.Tests.Integration/SqlExecutor/MySqlExecutorTest.Procedure.cs
create mode 100644 test/Util.Data.Dapper.MySql.Tests.Integration/SqlExecutor/MySqlExecutorTest.Transaction.cs
create mode 100644 test/Util.Data.Dapper.MySql.Tests.Integration/SqlExecutor/MySqlExecutorTest.cs
create mode 100644 test/Util.Data.Dapper.MySql.Tests.Integration/SqlQuery/MySqlQueryTest.Exists.cs
create mode 100644 test/Util.Data.Dapper.MySql.Tests.Integration/SqlQuery/MySqlQueryTest.Procedure.cs
create mode 100644 test/Util.Data.Dapper.MySql.Tests.Integration/SqlQuery/MySqlQueryTest.Query.cs
create mode 100644 test/Util.Data.Dapper.MySql.Tests.Integration/SqlQuery/MySqlQueryTest.Scalar.cs
create mode 100644 test/Util.Data.Dapper.MySql.Tests.Integration/SqlQuery/MySqlQueryTest.Single.cs
create mode 100644 test/Util.Data.Dapper.MySql.Tests.Integration/SqlQuery/MySqlQueryTest.cs
create mode 100644 test/Util.Data.Dapper.MySql.Tests.Integration/Startup.cs
create mode 100644 test/Util.Data.Dapper.MySql.Tests.Integration/Util.Data.Dapper.MySql.Tests.Integration.csproj
create mode 100644 test/Util.Data.Dapper.MySql.Tests.Integration/appsettings.Development.json
create mode 100644 test/Util.Data.Dapper.MySql.Tests.Integration/appsettings.json
create mode 100644 test/Util.Data.Dapper.PostgreSql.Tests.Integration/Infrastructure/DatabaseScript.cs
create mode 100644 test/Util.Data.Dapper.PostgreSql.Tests.Integration/Metadata/PostgreSqlMetadataServiceTest.cs
create mode 100644 test/Util.Data.Dapper.PostgreSql.Tests.Integration/SqlBuilders/PostgreSqlExistsSqlBuilderTest.cs
create mode 100644 test/Util.Data.Dapper.PostgreSql.Tests.Integration/SqlExecutor/PostgreSqlExecutorTest.Execute.cs
create mode 100644 test/Util.Data.Dapper.PostgreSql.Tests.Integration/SqlExecutor/PostgreSqlExecutorTest.Id.cs
create mode 100644 test/Util.Data.Dapper.PostgreSql.Tests.Integration/SqlExecutor/PostgreSqlExecutorTest.Insert.cs
create mode 100644 test/Util.Data.Dapper.PostgreSql.Tests.Integration/SqlExecutor/PostgreSqlExecutorTest.Param.cs
create mode 100644 test/Util.Data.Dapper.PostgreSql.Tests.Integration/SqlExecutor/PostgreSqlExecutorTest.Procedure.cs
create mode 100644 test/Util.Data.Dapper.PostgreSql.Tests.Integration/SqlExecutor/PostgreSqlExecutorTest.cs
create mode 100644 test/Util.Data.Dapper.PostgreSql.Tests.Integration/SqlExecutor/SqlServerSqlExecutorTest.Transaction.cs
create mode 100644 test/Util.Data.Dapper.PostgreSql.Tests.Integration/SqlQuery/PostgreSqlQueryTest.Exists.cs
create mode 100644 test/Util.Data.Dapper.PostgreSql.Tests.Integration/SqlQuery/PostgreSqlQueryTest.Procedure.cs
create mode 100644 test/Util.Data.Dapper.PostgreSql.Tests.Integration/SqlQuery/PostgreSqlQueryTest.Query.cs
create mode 100644 test/Util.Data.Dapper.PostgreSql.Tests.Integration/SqlQuery/PostgreSqlQueryTest.Scalar.cs
create mode 100644 test/Util.Data.Dapper.PostgreSql.Tests.Integration/SqlQuery/PostgreSqlQueryTest.Single.cs
create mode 100644 test/Util.Data.Dapper.PostgreSql.Tests.Integration/SqlQuery/PostgreSqlQueryTest.cs
create mode 100644 test/Util.Data.Dapper.PostgreSql.Tests.Integration/Startup.cs
create mode 100644 test/Util.Data.Dapper.PostgreSql.Tests.Integration/Util.Data.Dapper.PostgreSql.Tests.Integration.csproj
create mode 100644 test/Util.Data.Dapper.PostgreSql.Tests.Integration/appsettings.Development.json
create mode 100644 test/Util.Data.Dapper.PostgreSql.Tests.Integration/appsettings.json
create mode 100644 test/Util.Data.Dapper.SqlServer.Tests.Integration/Infrastructure/DatabaseScript.cs
create mode 100644 test/Util.Data.Dapper.SqlServer.Tests.Integration/Metadata/SqlServerMetadataServiceTest.cs
create mode 100644 test/Util.Data.Dapper.SqlServer.Tests.Integration/SqlBuilders/SqlServerExistsSqlBuilderTest.cs
create mode 100644 test/Util.Data.Dapper.SqlServer.Tests.Integration/SqlExecutor/SqlServerSqlExecutorTest.Execute.cs
create mode 100644 test/Util.Data.Dapper.SqlServer.Tests.Integration/SqlExecutor/SqlServerSqlExecutorTest.Id.cs
create mode 100644 test/Util.Data.Dapper.SqlServer.Tests.Integration/SqlExecutor/SqlServerSqlExecutorTest.Insert.cs
create mode 100644 test/Util.Data.Dapper.SqlServer.Tests.Integration/SqlExecutor/SqlServerSqlExecutorTest.Param.cs
create mode 100644 test/Util.Data.Dapper.SqlServer.Tests.Integration/SqlExecutor/SqlServerSqlExecutorTest.Procedure.cs
create mode 100644 test/Util.Data.Dapper.SqlServer.Tests.Integration/SqlExecutor/SqlServerSqlExecutorTest.Transaction.cs
create mode 100644 test/Util.Data.Dapper.SqlServer.Tests.Integration/SqlExecutor/SqlServerSqlExecutorTest.cs
create mode 100644 test/Util.Data.Dapper.SqlServer.Tests.Integration/SqlQuery/SqlServerSqlQueryTest.Exists.cs
create mode 100644 test/Util.Data.Dapper.SqlServer.Tests.Integration/SqlQuery/SqlServerSqlQueryTest.Procedure.cs
create mode 100644 test/Util.Data.Dapper.SqlServer.Tests.Integration/SqlQuery/SqlServerSqlQueryTest.Query.cs
create mode 100644 test/Util.Data.Dapper.SqlServer.Tests.Integration/SqlQuery/SqlServerSqlQueryTest.Scalar.cs
create mode 100644 test/Util.Data.Dapper.SqlServer.Tests.Integration/SqlQuery/SqlServerSqlQueryTest.Single.cs
create mode 100644 test/Util.Data.Dapper.SqlServer.Tests.Integration/SqlQuery/SqlServerSqlQueryTest.cs
create mode 100644 test/Util.Data.Dapper.SqlServer.Tests.Integration/Startup.cs
create mode 100644 test/Util.Data.Dapper.SqlServer.Tests.Integration/Util.Data.Dapper.SqlServer.Tests.Integration.csproj
create mode 100644 test/Util.Data.Dapper.SqlServer.Tests.Integration/appsettings.Development.json
create mode 100644 test/Util.Data.Dapper.SqlServer.Tests.Integration/appsettings.json
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.Data.EntityFrameworkCore.MySql.Tests.Integration}/Filters/DeleteFilterTest.cs (97%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.Data.EntityFrameworkCore.MySql.Tests.Integration}/Filters/FilterManagerTest.cs (97%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.Data.EntityFrameworkCore.MySql.Tests.Integration}/Startup.cs (80%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.Data.EntityFrameworkCore.MySql.Tests.Integration}/Tests/CustomerRepositoryTest.cs (78%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.Data.EntityFrameworkCore.MySql.Tests.Integration}/Tests/EntityEventsTest.cs (51%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.Data.EntityFrameworkCore.MySql.Tests.Integration}/Tests/OperationLogRepositoryTest.cs (65%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.Data.EntityFrameworkCore.MySql.Tests.Integration}/Tests/OrderRepositoryTest.cs (73%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.Data.EntityFrameworkCore.MySql.Tests.Integration}/Tests/PostRepositoryTest.cs (81%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.Data.EntityFrameworkCore.MySql.Tests.Integration}/Tests/ProductRepositoryTest.Queryable.cs (78%)
create mode 100644 test/Util.Data.EntityFrameworkCore.MySql.Tests.Integration/Tests/ProductRepositoryTest.cs
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.Data.EntityFrameworkCore.MySql.Tests.Integration}/Tests/TagRepositoryTest.cs (75%)
create mode 100644 test/Util.Data.EntityFrameworkCore.MySql.Tests.Integration/Util.Data.EntityFrameworkCore.MySql.Tests.Integration.csproj
create mode 100644 test/Util.Data.EntityFrameworkCore.MySql.Tests.Integration/appsettings.Development.json
create mode 100644 test/Util.Data.EntityFrameworkCore.MySql.Tests.Integration/appsettings.json
create mode 100644 test/Util.Data.EntityFrameworkCore.Oracle.Tests.Integration/Filters/DeleteFilterTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.Oracle.Tests.Integration/Filters/FilterManagerTest.cs
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.Data.EntityFrameworkCore.Oracle.Tests.Integration}/Startup.cs (76%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.Data.EntityFrameworkCore.Oracle.Tests.Integration}/Tests/CustomerRepositoryTest.cs (77%)
create mode 100644 test/Util.Data.EntityFrameworkCore.Oracle.Tests.Integration/Tests/EntityEventsTest.cs
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.Data.EntityFrameworkCore.Oracle.Tests.Integration}/Tests/OperationLogRepositoryTest.cs (63%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.Data.EntityFrameworkCore.Oracle.Tests.Integration}/Tests/OrderRepositoryTest.cs (72%)
create mode 100644 test/Util.Data.EntityFrameworkCore.Oracle.Tests.Integration/Tests/PostRepositoryTest.cs
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.Data.EntityFrameworkCore.Oracle.Tests.Integration}/Tests/ProductRepositoryTest.Queryable.cs (77%)
create mode 100644 test/Util.Data.EntityFrameworkCore.Oracle.Tests.Integration/Tests/ProductRepositoryTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.Oracle.Tests.Integration/Tests/TagRepositoryTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.Oracle.Tests.Integration/Util.Data.EntityFrameworkCore.Oracle.Tests.Integration.csproj
create mode 100644 test/Util.Data.EntityFrameworkCore.Oracle.Tests.Integration/appsettings.Development.json
create mode 100644 test/Util.Data.EntityFrameworkCore.Oracle.Tests.Integration/appsettings.json
create mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests.Integration/Filters/DeleteFilterTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests.Integration/Filters/FilterManagerTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests.Integration/Startup.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests.Integration/Tests/CustomerRepositoryTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests.Integration/Tests/EntityEventsTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests.Integration/Tests/OperationLogRepositoryTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests.Integration/Tests/OrderRepositoryTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests.Integration/Tests/PostRepositoryTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests.Integration/Tests/ProductRepositoryTest.Queryable.cs
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.Data.EntityFrameworkCore.PostgreSql.Tests.Integration}/Tests/ProductRepositoryTest.cs (72%)
create mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests.Integration/Tests/TagRepositoryTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests.Integration/Util.Data.EntityFrameworkCore.PostgreSql.Tests.Integration.csproj
create mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests.Integration/appsettings.Development.json
create mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests.Integration/appsettings.json
delete mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests/Fakes/CustomerFakeService.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests/Fakes/OrderFakeService.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests/Fakes/ProductFakeService.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests/Infrastructure/TestBase.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests/Infrastructure/TestSession.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests/Models/OperationLog.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests/Models/ProductItem.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests/Models/ProductItem2.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests/Repositories/ICustomerRepository.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests/Repositories/IOperationLogRepository.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests/Repositories/IOrderRepository.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests/Repositories/IProductRepository.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests/UnitOfWorks/IPgSqlUnitOfWork.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests/Util.Data.EntityFrameworkCore.PostgreSql.Tests.csproj
delete mode 100644 test/Util.Data.EntityFrameworkCore.PostgreSql.Tests/appsettings.json
create mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests.Integration/Filters/DeleteFilterTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests.Integration/Filters/FilterManagerTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests.Integration/Startup.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests.Integration/Tests/CustomerRepositoryTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests.Integration/Tests/EntityEventsTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests.Integration/Tests/OperationLogRepositoryTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests.Integration/Tests/OrderRepositoryTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests.Integration/Tests/PostRepositoryTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests.Integration/Tests/ProductRepositoryTest.Queryable.cs
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.Data.EntityFrameworkCore.SqlServer.Tests.Integration}/Tests/ProductRepositoryTest.cs (73%)
create mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests.Integration/Tests/TagRepositoryTest.cs
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests/Util.Data.EntityFrameworkCore.SqlServer.Tests.csproj => Util.Data.EntityFrameworkCore.SqlServer.Tests.Integration/Util.Data.EntityFrameworkCore.SqlServer.Tests.Integration.csproj} (56%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests/appsettings.json => Util.Data.EntityFrameworkCore.SqlServer.Tests.Integration/appsettings.Development.json} (100%)
create mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests.Integration/appsettings.json
delete mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests/Conditions/ProductNameCondition.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests/Document/PowerDesigner/Util_Data_EF_Test_SqlServer.pdb
delete mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests/Document/PowerDesigner/Util_Data_EF_Test_SqlServer.pdm
delete mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests/Fakes/CustomerFakeService.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests/Fakes/OperationLogFakeService.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests/Fakes/OrderItemFakeService.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests/Fakes/ProductFakeService.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests/Infrastructure/TestBase.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests/Models/Customer.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests/Models/Order.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests/Models/OrderItem.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests/Models/Product.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests/Models/ProductEnum.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests/Repositories/ICustomerRepository.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests/Repositories/IProductRepository.cs
delete mode 100644 test/Util.Data.EntityFrameworkCore.SqlServer.Tests/UnitOfWorks/ISqlServerUnitOfWork.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.Sqlite.Tests.Integration/Filters/DeleteFilterTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.Sqlite.Tests.Integration/Filters/FilterManagerTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.Sqlite.Tests.Integration/Startup.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.Sqlite.Tests.Integration/Tests/CustomerRepositoryTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.Sqlite.Tests.Integration/Tests/EntityEventsTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.Sqlite.Tests.Integration/Tests/OperationLogRepositoryTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.Sqlite.Tests.Integration/Tests/OrderRepositoryTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.Sqlite.Tests.Integration/Tests/PostRepositoryTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.Sqlite.Tests.Integration/Tests/ProductRepositoryTest.Queryable.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.Sqlite.Tests.Integration/Tests/ProductRepositoryTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.Sqlite.Tests.Integration/Tests/TagRepositoryTest.cs
create mode 100644 test/Util.Data.EntityFrameworkCore.Sqlite.Tests.Integration/Util.Data.EntityFrameworkCore.Sqlite.Tests.Integration.csproj
create mode 100644 test/Util.Data.EntityFrameworkCore.Sqlite.Tests.Integration/appsettings.Development.json
create mode 100644 test/Util.Data.EntityFrameworkCore.Sqlite.Tests.Integration/appsettings.json
create mode 100644 test/Util.Data.Sql.Tests/Builders/Clauses/EndClauseTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Clauses/FromClauseTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Clauses/GroupByClauseTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Clauses/InsertClauseTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Clauses/JoinClauseTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Clauses/OrderByClauseTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Clauses/SelectClauseTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Clauses/StartClauseTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Clauses/WhereClauseTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Conditions/AndConditionTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Conditions/ContainsConditionTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Conditions/EndsConditionTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Conditions/EqualConditionTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Conditions/ExistsConditionTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Conditions/GreaterConditionTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Conditions/GreaterEqualConditionTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Conditions/InConditionTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Conditions/IsNotNullConditionTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Conditions/IsNullConditionTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Conditions/LessConditionTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Conditions/LessEqualConditionTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Conditions/NotEqualConditionTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Conditions/NotExistsConditionTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Conditions/NotInConditionTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Conditions/OrConditionTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Conditions/SegmentConditionTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Conditions/StartsConditionTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Core/ColumnItemTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Core/OrderByItemTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Core/SplitItemTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Core/SqlBuilderItemTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Core/SqlConditionFactoryTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Core/TableItemTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Params/ParameterManagerTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/Sets/SqlBuilderSetTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.End.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.From.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.GroupBy.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.Insert.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.Join.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.OrderBy.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.Parameter.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.Select.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.Set.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.Start.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.Where.cs
create mode 100644 test/Util.Data.Sql.Tests/Builders/SqlBuilderTest.cs
create mode 100644 test/Util.Data.Sql.Tests/Samples/TestColumnCache.cs
create mode 100644 test/Util.Data.Sql.Tests/Samples/TestDialect.cs
create mode 100644 test/Util.Data.Sql.Tests/Samples/TestDialect2.cs
create mode 100644 test/Util.Data.Sql.Tests/Samples/TestParameter.cs
create mode 100644 test/Util.Data.Sql.Tests/Samples/TestSqlBuilder.cs
create mode 100644 test/Util.Data.Sql.Tests/Util.Data.Sql.Tests.csproj
create mode 100644 test/Util.Localization.Resources/Properties/AssemblyInfo.cs
create mode 100644 test/Util.Localization.Resources/ResourceTypes/Resource101.cs
create mode 100644 test/Util.Localization.Resources/ResourceTypes/Resource102.cs
create mode 100644 test/Util.Localization.Resources/Resources2/ResourceTypes.Resource101.en-US.json
create mode 100644 test/Util.Localization.Resources/Resources2/ResourceTypes.Resource101.zh-CN.json
create mode 100644 test/Util.Localization.Resources/Resources2/ResourceTypes/Resource102.zh-CN.json
create mode 100644 test/Util.Localization.Resources/Util.Localization.Resources.csproj
create mode 100644 test/Util.Localization.Tests.Integration/Properties/AssemblyInfo.cs
create mode 100644 test/Util.Localization.Tests.Integration/Properties/launchSettings.json
create mode 100644 test/Util.Localization.Tests.Integration/ResourceTypes/Resource1.cs
create mode 100644 test/Util.Localization.Tests.Integration/ResourceTypes/Resource2.cs
create mode 100644 test/Util.Localization.Tests.Integration/ResourceTypes/Resource3.cs
create mode 100644 test/Util.Localization.Tests.Integration/ResourceTypes/Resource4.cs
create mode 100644 test/Util.Localization.Tests.Integration/ResourceTypes/Resource5.cs
create mode 100644 test/Util.Localization.Tests.Integration/ResourceTypes/Resource6.cs
create mode 100644 test/Util.Localization.Tests.Integration/Resources/ResourceTypes.Resource1.en-US.json
create mode 100644 test/Util.Localization.Tests.Integration/Resources/ResourceTypes.Resource1.zh-CN.json
create mode 100644 test/Util.Localization.Tests.Integration/Resources/ResourceTypes/Resource2.en-US.json
create mode 100644 test/Util.Localization.Tests.Integration/Resources/ResourceTypes/Resource2.zh-CN.json
create mode 100644 test/Util.Localization.Tests.Integration/Resources/ResourceTypes/Resource2.zh-Hans.json
create mode 100644 test/Util.Localization.Tests.Integration/Resources/ResourceTypes/Resource2.zh.json
create mode 100644 test/Util.Localization.Tests.Integration/Resources/ResourceTypes/Resource3.zh-Hans.json
create mode 100644 test/Util.Localization.Tests.Integration/Resources/ResourceTypes/Resource4.Resource41.zh-CN.json
create mode 100644 test/Util.Localization.Tests.Integration/Resources/ResourceTypes/Resource4.zh.json
create mode 100644 test/Util.Localization.Tests.Integration/Resources/ResourceTypes/Resource5.zh-CN.json
create mode 100644 test/Util.Localization.Tests.Integration/Resources/ResourceTypes/Resource5.zh-Hans.json
create mode 100644 test/Util.Localization.Tests.Integration/Resources/ResourceTypes/Resource5.zh.json
create mode 100644 test/Util.Localization.Tests.Integration/Resources/zh.json
create mode 100644 test/Util.Localization.Tests.Integration/Startup.cs
create mode 100644 test/Util.Localization.Tests.Integration/Tests/JsonStringLocalizerFactoryTest.cs
create mode 100644 test/Util.Localization.Tests.Integration/Tests/PathResolverTest.cs
create mode 100644 test/Util.Localization.Tests.Integration/Tests/StringLocalizerTest.cs
create mode 100644 test/Util.Localization.Tests.Integration/Util.Localization.Tests.Integration.csproj
rename test/{Util.Logging.Serilog.Tests => Util.Logging.Serilog.Exceptionless.Tests.Integration}/LogContextAccessor.cs (100%)
rename test/{Util.Logging.Serilog.Exceptionless.Tests => Util.Logging.Serilog.Exceptionless.Tests.Integration}/LogTest.cs (97%)
rename test/{Util.Logging.Serilog.Tests => Util.Logging.Serilog.Exceptionless.Tests.Integration}/Samples/Product.cs (100%)
rename test/{Util.Logging.Serilog.Exceptionless.Tests => Util.Logging.Serilog.Exceptionless.Tests.Integration}/Startup.cs (68%)
rename test/{Util.Logging.Serilog.Exceptionless.Tests/Util.Logging.Serilog.Exceptionless.Tests.csproj => Util.Logging.Serilog.Exceptionless.Tests.Integration/Util.Logging.Serilog.Exceptionless.Tests.Integration.csproj} (79%)
create mode 100644 test/Util.Logging.Serilog.Exceptionless.Tests.Integration/appsettings.Production.json
rename test/{Util.Logging.Serilog.Exceptionless.Tests => Util.Logging.Serilog.Exceptionless.Tests.Integration}/appsettings.json (59%)
rename test/{Util.Logging.Serilog.Exceptionless.Tests => Util.Logging.Serilog.Tests.Integration}/LogContextAccessor.cs (93%)
rename test/{Util.Logging.Serilog.Tests => Util.Logging.Serilog.Tests.Integration}/LogTest.cs (100%)
rename test/{Util.Logging.Serilog.Exceptionless.Tests => Util.Logging.Serilog.Tests.Integration}/Samples/Product.cs (88%)
rename test/{Util.Logging.Serilog.Tests => Util.Logging.Serilog.Tests.Integration}/Startup.cs (87%)
rename test/{Util.Logging.Serilog.Tests/Util.Logging.Serilog.Tests.csproj => Util.Logging.Serilog.Tests.Integration/Util.Logging.Serilog.Tests.Integration.csproj} (86%)
rename test/{Util.Logging.Serilog.Tests => Util.Logging.Serilog.Tests.Integration}/appsettings.json (100%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare.MySql}/EntityTypeConfigurations/CustomerConfiguration.cs (81%)
create mode 100644 test/Util.TestShare.MySql/EntityTypeConfigurations/OperationLogConfiguration.cs
create mode 100644 test/Util.TestShare.MySql/EntityTypeConfigurations/OrderConfiguration.cs
create mode 100644 test/Util.TestShare.MySql/EntityTypeConfigurations/OrderItemConfiguration.cs
create mode 100644 test/Util.TestShare.MySql/EntityTypeConfigurations/PostConfiguration.cs
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare.MySql}/EntityTypeConfigurations/ProductConfiguration.cs (62%)
create mode 100644 test/Util.TestShare.MySql/EntityTypeConfigurations/TagConfiguration.cs
rename test/{Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration => Util.TestShare.MySql}/Repositories/CustomerRepository.cs (62%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare.MySql}/Repositories/OperationLogRepository.cs (57%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare.MySql}/Repositories/OrderRepository.cs (55%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare.MySql}/Repositories/PostRepository.cs (55%)
rename test/{Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration => Util.TestShare.MySql}/Repositories/ProductRepository.cs (73%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare.MySql}/Repositories/TagRepository.cs (55%)
create mode 100644 test/Util.TestShare.MySql/UnitOfWorks/MySqlUnitOfWork.cs
create mode 100644 test/Util.TestShare.MySql/Util.TestShare.MySql.csproj
create mode 100644 test/Util.TestShare.Oracle/EntityTypeConfigurations/CustomerConfiguration.cs
create mode 100644 test/Util.TestShare.Oracle/EntityTypeConfigurations/OperationLogConfiguration.cs
create mode 100644 test/Util.TestShare.Oracle/EntityTypeConfigurations/OrderConfiguration.cs
create mode 100644 test/Util.TestShare.Oracle/EntityTypeConfigurations/OrderItemConfiguration.cs
create mode 100644 test/Util.TestShare.Oracle/EntityTypeConfigurations/PostConfiguration.cs
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.TestShare.Oracle}/EntityTypeConfigurations/ProductConfiguration.cs (62%)
create mode 100644 test/Util.TestShare.Oracle/EntityTypeConfigurations/TagConfiguration.cs
rename test/{Util.Application.WebApi.Tests.Integration => Util.TestShare.Oracle}/Repositories/CustomerRepository.cs (62%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.TestShare.Oracle}/Repositories/OperationLogRepository.cs (57%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.TestShare.Oracle}/Repositories/OrderRepository.cs (55%)
create mode 100644 test/Util.TestShare.Oracle/Repositories/PostRepository.cs
rename test/{Util.Application.WebApi.Tests.Integration => Util.TestShare.Oracle}/Repositories/ProductRepository.cs (73%)
create mode 100644 test/Util.TestShare.Oracle/Repositories/TagRepository.cs
create mode 100644 test/Util.TestShare.Oracle/UnitOfWorks/OracleUnitOfWork.cs
create mode 100644 test/Util.TestShare.Oracle/Util.TestShare.Oracle.csproj
rename test/{Util.Application.WebApi.Tests.Integration => Util.TestShare.PostgreSql}/EntityTypeConfigurations/CustomerConfiguration.cs (86%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.TestShare.PostgreSql}/EntityTypeConfigurations/OperationLogConfiguration.cs (94%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.TestShare.PostgreSql}/EntityTypeConfigurations/OrderConfiguration.cs (80%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.TestShare.PostgreSql}/EntityTypeConfigurations/OrderItemConfiguration.cs (93%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare.PostgreSql}/EntityTypeConfigurations/PostConfiguration.cs (91%)
rename test/{Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration => Util.TestShare.PostgreSql}/EntityTypeConfigurations/ProductConfiguration.cs (67%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare.PostgreSql}/EntityTypeConfigurations/TagConfiguration.cs (90%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare.PostgreSql}/Repositories/CustomerRepository.cs (56%)
create mode 100644 test/Util.TestShare.PostgreSql/Repositories/OperationLogRepository.cs
create mode 100644 test/Util.TestShare.PostgreSql/Repositories/OrderRepository.cs
create mode 100644 test/Util.TestShare.PostgreSql/Repositories/PostRepository.cs
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare.PostgreSql}/Repositories/ProductRepository.cs (68%)
create mode 100644 test/Util.TestShare.PostgreSql/Repositories/TagRepository.cs
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare.PostgreSql}/UnitOfWorks/PgSqlUnitOfWork.cs (82%)
create mode 100644 test/Util.TestShare.PostgreSql/Util.TestShare.PostgreSql.csproj
rename test/{Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration => Util.TestShare.SqlServer}/EntityTypeConfigurations/CustomerConfiguration.cs (86%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare.SqlServer}/EntityTypeConfigurations/OperationLogConfiguration.cs (92%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare.SqlServer}/EntityTypeConfigurations/OrderConfiguration.cs (80%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare.SqlServer}/EntityTypeConfigurations/OrderItemConfiguration.cs (93%)
create mode 100644 test/Util.TestShare.SqlServer/EntityTypeConfigurations/PostConfiguration.cs
rename test/{Util.Application.WebApi.Tests.Integration => Util.TestShare.SqlServer}/EntityTypeConfigurations/ProductConfiguration.cs (67%)
create mode 100644 test/Util.TestShare.SqlServer/EntityTypeConfigurations/TagConfiguration.cs
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.TestShare.SqlServer}/Repositories/CustomerRepository.cs (55%)
create mode 100644 test/Util.TestShare.SqlServer/Repositories/OperationLogRepository.cs
create mode 100644 test/Util.TestShare.SqlServer/Repositories/OrderRepository.cs
create mode 100644 test/Util.TestShare.SqlServer/Repositories/PostRepository.cs
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.TestShare.SqlServer}/Repositories/ProductRepository.cs (68%)
create mode 100644 test/Util.TestShare.SqlServer/Repositories/TagRepository.cs
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.TestShare.SqlServer}/UnitOfWorks/SqlServerUnitOfWork.cs (89%)
create mode 100644 test/Util.TestShare.SqlServer/Util.TestShare.SqlServer.csproj
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.TestShare.Sqlite}/EntityTypeConfigurations/CustomerConfiguration.cs (81%)
create mode 100644 test/Util.TestShare.Sqlite/EntityTypeConfigurations/OperationLogConfiguration.cs
create mode 100644 test/Util.TestShare.Sqlite/EntityTypeConfigurations/OrderConfiguration.cs
create mode 100644 test/Util.TestShare.Sqlite/EntityTypeConfigurations/OrderItemConfiguration.cs
create mode 100644 test/Util.TestShare.Sqlite/EntityTypeConfigurations/PostConfiguration.cs
create mode 100644 test/Util.TestShare.Sqlite/EntityTypeConfigurations/ProductConfiguration.cs
create mode 100644 test/Util.TestShare.Sqlite/EntityTypeConfigurations/TagConfiguration.cs
create mode 100644 test/Util.TestShare.Sqlite/Repositories/CustomerRepository.cs
create mode 100644 test/Util.TestShare.Sqlite/Repositories/OperationLogRepository.cs
create mode 100644 test/Util.TestShare.Sqlite/Repositories/OrderRepository.cs
create mode 100644 test/Util.TestShare.Sqlite/Repositories/PostRepository.cs
create mode 100644 test/Util.TestShare.Sqlite/Repositories/ProductRepository.cs
create mode 100644 test/Util.TestShare.Sqlite/Repositories/TagRepository.cs
create mode 100644 test/Util.TestShare.Sqlite/UnitOfWorks/SqliteUnitOfWork.cs
create mode 100644 test/Util.TestShare.Sqlite/Util.TestShare.Sqlite.csproj
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare}/Conditions/ProductNameCondition.cs (88%)
create mode 100644 test/Util.TestShare/Configs/TestConfig.cs
rename test/{Util.Application.WebApi.Tests.Integration => Util.TestShare}/Controllers/CustomerController.cs (92%)
rename test/{Util.Application.WebApi.Tests.Integration => Util.TestShare}/Controllers/ProductController.cs (95%)
rename test/{Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration => Util.TestShare}/Dtos/CustomerDto.cs (97%)
rename test/{Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration => Util.TestShare}/Dtos/ProductDto.cs (96%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.TestShare}/EventHandlers/OperationLogChangedEventHandler.cs (78%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.TestShare}/EventHandlers/OperationLogDeletedEventHandler.cs (78%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.TestShare}/EventHandlers/ProductChangedEventHandler.cs (83%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.TestShare}/EventHandlers/ProductCreatedEventHandler.cs (77%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.TestShare}/EventHandlers/ProductDeletedEventHandler.cs (77%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.TestShare}/EventHandlers/ProductUpdatedEventHandler.cs (77%)
rename test/{Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration => Util.TestShare}/Fakes/CustomerFakeService.cs (75%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare}/Fakes/OperationLogFakeService.cs (84%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.TestShare}/Fakes/OrderFakeService.cs (88%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare}/Fakes/OrderItemFakeService.cs (87%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare}/Fakes/PostFakeService.cs (88%)
rename test/{Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration => Util.TestShare}/Fakes/ProductFakeService.cs (81%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare}/Fakes/TagFakeService.cs (88%)
rename test/{Util.Application.WebApi.Tests.Integration/Infrastructure/TestBase.cs => Util.TestShare/Infrastructure/ControllerTestBase.cs} (94%)
rename test/{Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration => Util.TestShare}/Infrastructure/TestBase.cs (90%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.TestShare}/Infrastructure/TestSession.cs (91%)
rename test/{Util.Application.WebApi.Tests.Integration => Util.TestShare}/Infrastructure/WebApiResult.cs (80%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare}/Models/Customer.cs (96%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.TestShare}/Models/OperationLog.cs (97%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare}/Models/Order.cs (93%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare}/Models/OrderItem.cs (94%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare}/Models/Post.cs (98%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare}/Models/Product.cs (91%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare}/Models/ProductEnum.cs (73%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.TestShare}/Models/ProductItem.cs (89%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.TestShare}/Models/ProductItem2.cs (90%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare}/Models/Tag.cs (97%)
rename test/{Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration => Util.TestShare}/Queries/CustomerQuery.cs (98%)
rename test/{Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration => Util.TestShare}/Queries/ProductQuery.cs (98%)
rename test/{Util.Application.WebApi.Tests.Integration => Util.TestShare}/Repositories/ICustomerRepository.cs (69%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.TestShare}/Repositories/IOperationLogRepository.cs (65%)
rename test/{Util.Data.EntityFrameworkCore.SqlServer.Tests => Util.TestShare}/Repositories/IOrderRepository.cs (62%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare}/Repositories/IPostRepository.cs (61%)
rename test/{Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration => Util.TestShare}/Repositories/IProductRepository.cs (81%)
rename test/{Util.Data.EntityFrameworkCore.PostgreSql.Tests => Util.TestShare}/Repositories/ITagRepository.cs (61%)
rename test/{Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration => Util.TestShare}/Services/CustomerQueryService.cs (85%)
rename test/{Util.Application.WebApi.Tests.Integration => Util.TestShare}/Services/CustomerService.cs (73%)
rename test/{Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration => Util.TestShare}/Services/ICustomerQueryService.cs (60%)
rename test/{Util.Application.WebApi.Tests.Integration => Util.TestShare}/Services/ICustomerService.cs (58%)
rename test/{Util.Application.WebApi.Tests.Integration => Util.TestShare}/Services/IProductService.cs (57%)
rename test/{Util.Application.EntityFrameworkCore.SqlServer.Tests.Integration => Util.TestShare}/Services/ProductService.cs (61%)
create mode 100644 test/Util.TestShare/UnitOfWorks/ITestUnitOfWork.cs
create mode 100644 test/Util.TestShare/Util.TestShare.csproj
diff --git a/.gitignore b/.gitignore
index 3aa440b0..3a65f4c9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,3 +16,4 @@ BenchmarkDotNet.Artifacts
/document/demo/*.pdb
/document/Test/PowerDesigner/*.pdb
/test/Util.Data.Dapper.SqlServer.Tests/Document/PowerDesigner/*.pdb
+/documents/PowerDesigner/*.pdb
diff --git a/Util.sln b/Util.sln
index f7f915d8..ea46c908 100644
--- a/Util.sln
+++ b/Util.sln
@@ -23,19 +23,21 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{E6328DC1-C
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "benchmark", "benchmark", "{199A0EFE-EE81-4A0E-9F2E-298CDDA49D26}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "sample", "sample", "{3E5A39C2-EEF3-40E4-A997-68D4BD65E3B1}"
+EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "01-Core", "01-Core", "{9BFB5DBE-8F64-45A9-BDB2-BAD91D44A4C5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Core.Tests.Integration", "test\Util.Core.Tests.Integration\Util.Core.Tests.Integration.csproj", "{21064598-1418-422E-BA37-8EC09541DFC1}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "02-Util.AspNetCore", "src\Util.AspNetCore\02-Util.AspNetCore.csproj", "{08EF3E38-E0C3-4E18-984C-3216CB6E8897}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "07-Util.AspNetCore", "src\Util.AspNetCore\07-Util.AspNetCore.csproj", "{08EF3E38-E0C3-4E18-984C-3216CB6E8897}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.AspNetCore.Tests", "test\Util.AspNetCore.Tests\Util.AspNetCore.Tests.csproj", "{108177E9-E113-4AE4-9B09-B25B2B4DE10E}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "03-Util.ObjectMapping.AutoMapper", "src\Util.ObjectMapping.AutoMapper\03-Util.ObjectMapping.AutoMapper.csproj", "{12C94395-09F1-42E4-8CE1-6E54D3FEBAA6}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "02-Util.ObjectMapping.AutoMapper", "src\Util.ObjectMapping.AutoMapper\02-Util.ObjectMapping.AutoMapper.csproj", "{12C94395-09F1-42E4-8CE1-6E54D3FEBAA6}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.ObjectMapping.AutoMapper.Tests", "test\Util.ObjectMapping.AutoMapper.Tests\Util.ObjectMapping.AutoMapper.Tests.csproj", "{955D94B8-747D-4CA4-832A-6377C9FF5B8F}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "04-Util.Aop.AspectCore", "src\Util.Aop.AspectCore\04-Util.Aop.AspectCore.csproj", "{FB337B27-C6C6-43A1-BFA5-58B3CF381BA8}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "03-Util.Aop.AspectCore", "src\Util.Aop.AspectCore\03-Util.Aop.AspectCore.csproj", "{FB337B27-C6C6-43A1-BFA5-58B3CF381BA8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Aop.AspectCore.Tests", "test\Util.Aop.AspectCore.Tests\Util.Aop.AspectCore.Tests.csproj", "{B8825802-81F7-4671-82E8-3A6E3A21F570}"
EndProject
@@ -57,7 +59,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Events.Tests", "test\U
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "06-Data", "06-Data", "{66A85767-2877-4B99-84F1-EEABC6DC5247}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "06-Data", "06-Data", "{CC492CA2-5D86-4DB8-AB15-B118DF27C344}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "07-Data", "07-Data", "{CC492CA2-5D86-4DB8-AB15-B118DF27C344}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Data.Tests", "test\Util.Data.Tests\Util.Data.Tests.csproj", "{4D40321F-2C3F-4ACB-8AE0-7A228DF0551B}"
EndProject
@@ -69,8 +71,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "02-EntityFrameworkCore", "0
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "02-Util.Data.EntityFrameworkCore.SqlServer", "src\Util.Data.EntityFrameworkCore.SqlServer\02-Util.Data.EntityFrameworkCore.SqlServer.csproj", "{04E5EDDB-8440-4BAD-9531-F87A3AC826FB}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Data.EntityFrameworkCore.SqlServer.Tests", "test\Util.Data.EntityFrameworkCore.SqlServer.Tests\Util.Data.EntityFrameworkCore.SqlServer.Tests.csproj", "{C752DABB-74C0-4232-80CF-CE6E7A153E67}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "02-Util.Templates.Razor", "src\Util.Templates.Razor\02-Util.Templates.Razor.csproj", "{4656C609-DBBA-4F6B-B16F-5E1A8C9D9858}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Templates.Razor.Tests", "test\Util.Templates.Razor.Tests\Util.Templates.Razor.Tests.csproj", "{95751DFC-B598-46B6-84BB-1B717567B886}"
@@ -81,15 +81,31 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "03-Util.Templates.Handlebar
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Templates.Handlebars.Tests", "test\Util.Templates.Handlebars.Tests\Util.Templates.Handlebars.Tests.csproj", "{78C9C726-BFAB-4B31-AFCB-5A229E69DC07}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "03-Util.Data.Metadata", "src\Util.Data.Metadata\03-Util.Data.Metadata.csproj", "{257A0A17-5D13-4DA4-8E91-8A3BB2711F49}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "03-Dapper", "03-Dapper", "{4A955BB3-C1AF-45DB-9590-82C00996B608}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "02-Util.Data.Dapper.SqlServer", "src\Util.Data.Dapper.SqlServer\02-Util.Data.Dapper.SqlServer.csproj", "{9A2C7C42-086B-4482-828D-7B02D85372ED}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "02-Util.Data.Sql", "src\Util.Data.Sql\02-Util.Data.Sql.csproj", "{661B88AE-6F83-437C-9A7E-C5C1A565E650}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Data.Sql.Tests", "test\Util.Data.Sql.Tests\Util.Data.Sql.Tests.csproj", "{C99E1554-5039-42BD-B1FD-93814FBEBE44}"
+EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Core.Benchmark", "benchmark\Util.Core.Benchmark\Util.Core.Benchmark.csproj", "{25C83DA5-BD4A-4AFA-8747-A0D16CB70500}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "01-Util.Data.Dapper.Core", "src\Util.Data.Dapper.Core\01-Util.Data.Dapper.Core.csproj", "{60424AB5-356A-4623-B1FB-7560334C0BE0}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "05-Util.Data.Dapper.All", "src\Util.Data.Dapper.All\05-Util.Data.Dapper.All.csproj", "{C2A4E6AB-16B9-4457-9445-FFBF672DFBCF}"
+EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "02-Util.Domain.Biz", "src\Util.Domain.Biz\02-Util.Domain.Biz.csproj", "{AFB629C5-00C2-492C-8787-C66D810A24DB}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "04-FreeSql", "04-FreeSql", "{9E4DED9F-F404-4512-AB88-91174BD81A45}"
+EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "07-Application", "07-Application", "{648CE3E3-CEC4-4F91-8696-6A3FB2F91220}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Application", "src\Util.Application\Util.Application.csproj", "{9404B5FE-3431-4EC0-BCC6-42525FC5D1B8}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "07-Application", "07-Application", "{BB24822F-F104-4D8E-9CB5-0A94DEF04BAB}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "08-Application", "08-Application", "{BB24822F-F104-4D8E-9CB5-0A94DEF04BAB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Application.Tests", "test\Util.Application.Tests\Util.Application.Tests.csproj", "{EF7BDA1B-22E7-4F3D-97E0-16C9C10AA1B0}"
EndProject
@@ -103,12 +119,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Application.EntityFram
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Application.WebApi", "src\Util.Application.WebApi\Util.Application.WebApi.csproj", "{3DE7DD7A-8500-46C9-91A1-A65DB60E0235}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Application.WebApi.Tests.Integration", "test\Util.Application.WebApi.Tests.Integration\Util.Application.WebApi.Tests.Integration.csproj", "{9F048957-54DF-47FA-B7A1-C98825853E46}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "03-Util.Data.EntityFrameworkCore.PostgreSql", "src\Util.Data.EntityFrameworkCore.PostgreSql\03-Util.Data.EntityFrameworkCore.PostgreSql.csproj", "{8618EE3F-F120-4AEA-8A77-F7BD5DCCB888}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Data.EntityFrameworkCore.PostgreSql.Tests", "test\Util.Data.EntityFrameworkCore.PostgreSql.Tests\Util.Data.EntityFrameworkCore.PostgreSql.Tests.csproj", "{EBD7AD52-21E3-41A0-BC74-5365A58A7778}"
-EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "02-Logging", "02-Logging", "{D5CF25B2-1A91-4065-A647-06CDF55F4B96}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "04-Templates", "04-Templates", "{2697EEFB-06BE-4786-89C6-A566FD94A41B}"
@@ -125,13 +137,71 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "01-Util.Logging", "src\Util
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Logging.Tests", "test\Util.Logging.Tests\Util.Logging.Tests.csproj", "{04EA7A93-CDC7-4C68-815D-699180D99DCE}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.WebApi.Sample", "sample\Util.WebApi.Sample\Util.WebApi.Sample.csproj", "{6FA4820A-DEBB-49BD-BA43-204D2477B92D}"
+EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "02-Util.Logging.Serilog", "src\Util.Logging.Serilog\02-Util.Logging.Serilog.csproj", "{A1186FB9-FB77-427C-9AEC-55E48A8D046A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "03-Util.Logging.Serilog.Exceptionless", "src\Util.Logging.Serilog.Exceptionless\03-Util.Logging.Serilog.Exceptionless.csproj", "{9960FA8A-98C1-45FB-8A09-33CA183AA140}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Logging.Serilog.Exceptionless.Tests", "test\Util.Logging.Serilog.Exceptionless.Tests\Util.Logging.Serilog.Exceptionless.Tests.csproj", "{F836BB0F-C5F4-4409-BDD8-C595FFD37807}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "06-Share", "06-Share", "{E3414144-C19E-40C0-A73A-2FD41AE514D1}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Logging.Serilog.Tests", "test\Util.Logging.Serilog.Tests\Util.Logging.Serilog.Tests.csproj", "{ED9522AF-9F6E-42AC-8750-1B34D8CB3716}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.TestShare", "test\Util.TestShare\Util.TestShare.csproj", "{1855CAB7-6379-47A4-A0A4-F890C6C46403}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "04-Util.Data.EntityFrameworkCore.MySql", "src\Util.Data.EntityFrameworkCore.MySql\04-Util.Data.EntityFrameworkCore.MySql.csproj", "{C43539A5-8343-4381-B2FD-5323323F1DB6}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Logging.Serilog.Tests.Integration", "test\Util.Logging.Serilog.Tests.Integration\Util.Logging.Serilog.Tests.Integration.csproj", "{D3C326CD-F1F1-4E06-962D-47F6C8090DEE}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Logging.Serilog.Exceptionless.Tests.Integration", "test\Util.Logging.Serilog.Exceptionless.Tests.Integration\Util.Logging.Serilog.Exceptionless.Tests.Integration.csproj", "{13690AB8-9AA4-4936-A25F-7AF1AE3D4ED0}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Data.EntityFrameworkCore.PostgreSql.Tests.Integration", "test\Util.Data.EntityFrameworkCore.PostgreSql.Tests.Integration\Util.Data.EntityFrameworkCore.PostgreSql.Tests.Integration.csproj", "{244A930D-5B84-4CBC-A3A7-7E8DE1E603D6}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Data.EntityFrameworkCore.SqlServer.Tests.Integration", "test\Util.Data.EntityFrameworkCore.SqlServer.Tests.Integration\Util.Data.EntityFrameworkCore.SqlServer.Tests.Integration.csproj", "{0EDF10D7-D6D6-48E2-AC0C-BA6D814CB633}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.TestShare.SqlServer", "test\Util.TestShare.SqlServer\Util.TestShare.SqlServer.csproj", "{05D8A63F-B3E1-4A5E-AA66-337BCF8840C1}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.TestShare.PostgreSql", "test\Util.TestShare.PostgreSql\Util.TestShare.PostgreSql.csproj", "{3993A838-71C9-49C5-80B3-16CC48A5F5C9}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Data.EntityFrameworkCore.MySql.Tests.Integration", "test\Util.Data.EntityFrameworkCore.MySql.Tests.Integration\Util.Data.EntityFrameworkCore.MySql.Tests.Integration.csproj", "{D785A240-1115-41C8-943E-5058161D6478}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.TestShare.MySql", "test\Util.TestShare.MySql\Util.TestShare.MySql.csproj", "{B1952639-773B-4C82-9D95-7CB4ED8AC59E}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Data.Dapper.SqlServer.Tests.Integration", "test\Util.Data.Dapper.SqlServer.Tests.Integration\Util.Data.Dapper.SqlServer.Tests.Integration.csproj", "{29792C72-565A-46DF-B887-494AC5352818}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Application.EntityFrameworkCore.PostgreSql.Tests.Integration", "test\Util.Application.EntityFrameworkCore.PostgreSql.Tests.Integration\Util.Application.EntityFrameworkCore.PostgreSql.Tests.Integration.csproj", "{C57D22E0-075B-4F27-87F1-E6CF5F203975}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Application.EntityFrameworkCore.MySql.Tests.Integration", "test\Util.Application.EntityFrameworkCore.MySql.Tests.Integration\Util.Application.EntityFrameworkCore.MySql.Tests.Integration.csproj", "{B9B66159-4FC7-4F94-8C21-ADC8CCED84F4}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Application.WebApi.SqlServer.Tests.Integration", "test\Util.Application.WebApi.SqlServer.Tests.Integration\Util.Application.WebApi.SqlServer.Tests.Integration.csproj", "{24FFA5F1-37CD-408B-80A9-006B5A6E11E8}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Application.WebApi.PostgreSql.Tests.Integration", "test\Util.Application.WebApi.PostgreSql.Tests.Integration\Util.Application.WebApi.PostgreSql.Tests.Integration.csproj", "{6FE28297-B958-4BC5-A320-A531874D7F58}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Application.WebApi.MySql.Tests.Integration", "test\Util.Application.WebApi.MySql.Tests.Integration\Util.Application.WebApi.MySql.Tests.Integration.csproj", "{838A27C6-F125-4C61-923E-7C855B598FBD}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Data.Dapper.PostgreSql.Tests.Integration", "test\Util.Data.Dapper.PostgreSql.Tests.Integration\Util.Data.Dapper.PostgreSql.Tests.Integration.csproj", "{FDE43241-3C82-4005-87B3-FD1349FEF4B6}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "03-Util.Data.Dapper.PostgreSql", "src\Util.Data.Dapper.PostgreSql\03-Util.Data.Dapper.PostgreSql.csproj", "{878A2744-5122-48A7-90E6-7D8CFABC29FD}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "04-Util.Data.Dapper.MySql", "src\Util.Data.Dapper.MySql\04-Util.Data.Dapper.MySql.csproj", "{0C464725-DEDC-4894-84A3-7A155E43818B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Data.Dapper.MySql.Tests.Integration", "test\Util.Data.Dapper.MySql.Tests.Integration\Util.Data.Dapper.MySql.Tests.Integration.csproj", "{AC831843-CDE2-4B67-8BC5-8F2A0D09B273}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "05-Util.Data.EntityFrameworkCore.Sqlite", "src\Util.Data.EntityFrameworkCore.Sqlite\05-Util.Data.EntityFrameworkCore.Sqlite.csproj", "{2BE691A3-19C0-4FCF-85D2-D2371C9462C6}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Data.EntityFrameworkCore.Sqlite.Tests.Integration", "test\Util.Data.EntityFrameworkCore.Sqlite.Tests.Integration\Util.Data.EntityFrameworkCore.Sqlite.Tests.Integration.csproj", "{B140F739-EC51-4265-B4B8-59467606E6EE}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.TestShare.Sqlite", "test\Util.TestShare.Sqlite\Util.TestShare.Sqlite.csproj", "{00E8EE51-A263-4971-9431-C4A2DEA4993A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "06-Util.Data.EntityFrameworkCore.Oracle", "src\Util.Data.EntityFrameworkCore.Oracle\06-Util.Data.EntityFrameworkCore.Oracle.csproj", "{6B2BA282-5C97-4A71-885F-E5259274F714}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.TestShare.Oracle", "test\Util.TestShare.Oracle\Util.TestShare.Oracle.csproj", "{05CF624D-F42E-461A-A21D-41BEE0CCEB5C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Data.EntityFrameworkCore.Oracle.Tests.Integration", "test\Util.Data.EntityFrameworkCore.Oracle.Tests.Integration\Util.Data.EntityFrameworkCore.Oracle.Tests.Integration.csproj", "{C4A782C1-AA25-476B-B936-90433422D0A2}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "04-Util.Localization", "src\Util.Localization\04-Util.Localization.csproj", "{D9E411DD-58B1-4160-8025-068D43ADE72C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Localization.Tests.Integration", "test\Util.Localization.Tests.Integration\Util.Localization.Tests.Integration.csproj", "{B2AADB36-8433-4EDB-B247-49A3EA82FE06}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Util.Localization.Resources", "test\Util.Localization.Resources\Util.Localization.Resources.csproj", "{40F2A962-6209-42D0-9F21-CEACB411007B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -215,10 +285,6 @@ Global
{04E5EDDB-8440-4BAD-9531-F87A3AC826FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{04E5EDDB-8440-4BAD-9531-F87A3AC826FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{04E5EDDB-8440-4BAD-9531-F87A3AC826FB}.Release|Any CPU.Build.0 = Release|Any CPU
- {C752DABB-74C0-4232-80CF-CE6E7A153E67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {C752DABB-74C0-4232-80CF-CE6E7A153E67}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {C752DABB-74C0-4232-80CF-CE6E7A153E67}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {C752DABB-74C0-4232-80CF-CE6E7A153E67}.Release|Any CPU.Build.0 = Release|Any CPU
{4656C609-DBBA-4F6B-B16F-5E1A8C9D9858}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4656C609-DBBA-4F6B-B16F-5E1A8C9D9858}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4656C609-DBBA-4F6B-B16F-5E1A8C9D9858}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -239,10 +305,34 @@ Global
{78C9C726-BFAB-4B31-AFCB-5A229E69DC07}.Debug|Any CPU.Build.0 = Debug|Any CPU
{78C9C726-BFAB-4B31-AFCB-5A229E69DC07}.Release|Any CPU.ActiveCfg = Release|Any CPU
{78C9C726-BFAB-4B31-AFCB-5A229E69DC07}.Release|Any CPU.Build.0 = Release|Any CPU
+ {257A0A17-5D13-4DA4-8E91-8A3BB2711F49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {257A0A17-5D13-4DA4-8E91-8A3BB2711F49}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {257A0A17-5D13-4DA4-8E91-8A3BB2711F49}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {257A0A17-5D13-4DA4-8E91-8A3BB2711F49}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9A2C7C42-086B-4482-828D-7B02D85372ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9A2C7C42-086B-4482-828D-7B02D85372ED}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9A2C7C42-086B-4482-828D-7B02D85372ED}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9A2C7C42-086B-4482-828D-7B02D85372ED}.Release|Any CPU.Build.0 = Release|Any CPU
+ {661B88AE-6F83-437C-9A7E-C5C1A565E650}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {661B88AE-6F83-437C-9A7E-C5C1A565E650}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {661B88AE-6F83-437C-9A7E-C5C1A565E650}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {661B88AE-6F83-437C-9A7E-C5C1A565E650}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C99E1554-5039-42BD-B1FD-93814FBEBE44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C99E1554-5039-42BD-B1FD-93814FBEBE44}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C99E1554-5039-42BD-B1FD-93814FBEBE44}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C99E1554-5039-42BD-B1FD-93814FBEBE44}.Release|Any CPU.Build.0 = Release|Any CPU
{25C83DA5-BD4A-4AFA-8747-A0D16CB70500}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{25C83DA5-BD4A-4AFA-8747-A0D16CB70500}.Debug|Any CPU.Build.0 = Debug|Any CPU
{25C83DA5-BD4A-4AFA-8747-A0D16CB70500}.Release|Any CPU.ActiveCfg = Release|Any CPU
{25C83DA5-BD4A-4AFA-8747-A0D16CB70500}.Release|Any CPU.Build.0 = Release|Any CPU
+ {60424AB5-356A-4623-B1FB-7560334C0BE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {60424AB5-356A-4623-B1FB-7560334C0BE0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {60424AB5-356A-4623-B1FB-7560334C0BE0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {60424AB5-356A-4623-B1FB-7560334C0BE0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C2A4E6AB-16B9-4457-9445-FFBF672DFBCF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C2A4E6AB-16B9-4457-9445-FFBF672DFBCF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C2A4E6AB-16B9-4457-9445-FFBF672DFBCF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C2A4E6AB-16B9-4457-9445-FFBF672DFBCF}.Release|Any CPU.Build.0 = Release|Any CPU
{AFB629C5-00C2-492C-8787-C66D810A24DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AFB629C5-00C2-492C-8787-C66D810A24DB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AFB629C5-00C2-492C-8787-C66D810A24DB}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -275,18 +365,10 @@ Global
{3DE7DD7A-8500-46C9-91A1-A65DB60E0235}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3DE7DD7A-8500-46C9-91A1-A65DB60E0235}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3DE7DD7A-8500-46C9-91A1-A65DB60E0235}.Release|Any CPU.Build.0 = Release|Any CPU
- {9F048957-54DF-47FA-B7A1-C98825853E46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {9F048957-54DF-47FA-B7A1-C98825853E46}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {9F048957-54DF-47FA-B7A1-C98825853E46}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {9F048957-54DF-47FA-B7A1-C98825853E46}.Release|Any CPU.Build.0 = Release|Any CPU
{8618EE3F-F120-4AEA-8A77-F7BD5DCCB888}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8618EE3F-F120-4AEA-8A77-F7BD5DCCB888}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8618EE3F-F120-4AEA-8A77-F7BD5DCCB888}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8618EE3F-F120-4AEA-8A77-F7BD5DCCB888}.Release|Any CPU.Build.0 = Release|Any CPU
- {EBD7AD52-21E3-41A0-BC74-5365A58A7778}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {EBD7AD52-21E3-41A0-BC74-5365A58A7778}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {EBD7AD52-21E3-41A0-BC74-5365A58A7778}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {EBD7AD52-21E3-41A0-BC74-5365A58A7778}.Release|Any CPU.Build.0 = Release|Any CPU
{577A7F6F-4836-4811-B715-32573127BDB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{577A7F6F-4836-4811-B715-32573127BDB3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{577A7F6F-4836-4811-B715-32573127BDB3}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -295,6 +377,10 @@ Global
{04EA7A93-CDC7-4C68-815D-699180D99DCE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{04EA7A93-CDC7-4C68-815D-699180D99DCE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{04EA7A93-CDC7-4C68-815D-699180D99DCE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6FA4820A-DEBB-49BD-BA43-204D2477B92D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6FA4820A-DEBB-49BD-BA43-204D2477B92D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6FA4820A-DEBB-49BD-BA43-204D2477B92D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6FA4820A-DEBB-49BD-BA43-204D2477B92D}.Release|Any CPU.Build.0 = Release|Any CPU
{A1186FB9-FB77-427C-9AEC-55E48A8D046A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A1186FB9-FB77-427C-9AEC-55E48A8D046A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A1186FB9-FB77-427C-9AEC-55E48A8D046A}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -303,14 +389,122 @@ Global
{9960FA8A-98C1-45FB-8A09-33CA183AA140}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9960FA8A-98C1-45FB-8A09-33CA183AA140}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9960FA8A-98C1-45FB-8A09-33CA183AA140}.Release|Any CPU.Build.0 = Release|Any CPU
- {F836BB0F-C5F4-4409-BDD8-C595FFD37807}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {F836BB0F-C5F4-4409-BDD8-C595FFD37807}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {F836BB0F-C5F4-4409-BDD8-C595FFD37807}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {F836BB0F-C5F4-4409-BDD8-C595FFD37807}.Release|Any CPU.Build.0 = Release|Any CPU
- {ED9522AF-9F6E-42AC-8750-1B34D8CB3716}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {ED9522AF-9F6E-42AC-8750-1B34D8CB3716}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {ED9522AF-9F6E-42AC-8750-1B34D8CB3716}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {ED9522AF-9F6E-42AC-8750-1B34D8CB3716}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1855CAB7-6379-47A4-A0A4-F890C6C46403}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1855CAB7-6379-47A4-A0A4-F890C6C46403}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1855CAB7-6379-47A4-A0A4-F890C6C46403}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1855CAB7-6379-47A4-A0A4-F890C6C46403}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C43539A5-8343-4381-B2FD-5323323F1DB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C43539A5-8343-4381-B2FD-5323323F1DB6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C43539A5-8343-4381-B2FD-5323323F1DB6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C43539A5-8343-4381-B2FD-5323323F1DB6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D3C326CD-F1F1-4E06-962D-47F6C8090DEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D3C326CD-F1F1-4E06-962D-47F6C8090DEE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D3C326CD-F1F1-4E06-962D-47F6C8090DEE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D3C326CD-F1F1-4E06-962D-47F6C8090DEE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {13690AB8-9AA4-4936-A25F-7AF1AE3D4ED0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {13690AB8-9AA4-4936-A25F-7AF1AE3D4ED0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {13690AB8-9AA4-4936-A25F-7AF1AE3D4ED0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {13690AB8-9AA4-4936-A25F-7AF1AE3D4ED0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {244A930D-5B84-4CBC-A3A7-7E8DE1E603D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {244A930D-5B84-4CBC-A3A7-7E8DE1E603D6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {244A930D-5B84-4CBC-A3A7-7E8DE1E603D6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {244A930D-5B84-4CBC-A3A7-7E8DE1E603D6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0EDF10D7-D6D6-48E2-AC0C-BA6D814CB633}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0EDF10D7-D6D6-48E2-AC0C-BA6D814CB633}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0EDF10D7-D6D6-48E2-AC0C-BA6D814CB633}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0EDF10D7-D6D6-48E2-AC0C-BA6D814CB633}.Release|Any CPU.Build.0 = Release|Any CPU
+ {05D8A63F-B3E1-4A5E-AA66-337BCF8840C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {05D8A63F-B3E1-4A5E-AA66-337BCF8840C1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {05D8A63F-B3E1-4A5E-AA66-337BCF8840C1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {05D8A63F-B3E1-4A5E-AA66-337BCF8840C1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3993A838-71C9-49C5-80B3-16CC48A5F5C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3993A838-71C9-49C5-80B3-16CC48A5F5C9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3993A838-71C9-49C5-80B3-16CC48A5F5C9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3993A838-71C9-49C5-80B3-16CC48A5F5C9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D785A240-1115-41C8-943E-5058161D6478}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D785A240-1115-41C8-943E-5058161D6478}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D785A240-1115-41C8-943E-5058161D6478}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D785A240-1115-41C8-943E-5058161D6478}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B1952639-773B-4C82-9D95-7CB4ED8AC59E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B1952639-773B-4C82-9D95-7CB4ED8AC59E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B1952639-773B-4C82-9D95-7CB4ED8AC59E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B1952639-773B-4C82-9D95-7CB4ED8AC59E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {29792C72-565A-46DF-B887-494AC5352818}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {29792C72-565A-46DF-B887-494AC5352818}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {29792C72-565A-46DF-B887-494AC5352818}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {29792C72-565A-46DF-B887-494AC5352818}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C57D22E0-075B-4F27-87F1-E6CF5F203975}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C57D22E0-075B-4F27-87F1-E6CF5F203975}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C57D22E0-075B-4F27-87F1-E6CF5F203975}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C57D22E0-075B-4F27-87F1-E6CF5F203975}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B9B66159-4FC7-4F94-8C21-ADC8CCED84F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B9B66159-4FC7-4F94-8C21-ADC8CCED84F4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B9B66159-4FC7-4F94-8C21-ADC8CCED84F4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B9B66159-4FC7-4F94-8C21-ADC8CCED84F4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {24FFA5F1-37CD-408B-80A9-006B5A6E11E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {24FFA5F1-37CD-408B-80A9-006B5A6E11E8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {24FFA5F1-37CD-408B-80A9-006B5A6E11E8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {24FFA5F1-37CD-408B-80A9-006B5A6E11E8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6FE28297-B958-4BC5-A320-A531874D7F58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6FE28297-B958-4BC5-A320-A531874D7F58}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6FE28297-B958-4BC5-A320-A531874D7F58}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6FE28297-B958-4BC5-A320-A531874D7F58}.Release|Any CPU.Build.0 = Release|Any CPU
+ {838A27C6-F125-4C61-923E-7C855B598FBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {838A27C6-F125-4C61-923E-7C855B598FBD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {838A27C6-F125-4C61-923E-7C855B598FBD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {838A27C6-F125-4C61-923E-7C855B598FBD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FDE43241-3C82-4005-87B3-FD1349FEF4B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FDE43241-3C82-4005-87B3-FD1349FEF4B6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FDE43241-3C82-4005-87B3-FD1349FEF4B6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FDE43241-3C82-4005-87B3-FD1349FEF4B6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {878A2744-5122-48A7-90E6-7D8CFABC29FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {878A2744-5122-48A7-90E6-7D8CFABC29FD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {878A2744-5122-48A7-90E6-7D8CFABC29FD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {878A2744-5122-48A7-90E6-7D8CFABC29FD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0C464725-DEDC-4894-84A3-7A155E43818B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0C464725-DEDC-4894-84A3-7A155E43818B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0C464725-DEDC-4894-84A3-7A155E43818B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0C464725-DEDC-4894-84A3-7A155E43818B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {AC831843-CDE2-4B67-8BC5-8F2A0D09B273}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {AC831843-CDE2-4B67-8BC5-8F2A0D09B273}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {AC831843-CDE2-4B67-8BC5-8F2A0D09B273}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {AC831843-CDE2-4B67-8BC5-8F2A0D09B273}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2BE691A3-19C0-4FCF-85D2-D2371C9462C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2BE691A3-19C0-4FCF-85D2-D2371C9462C6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2BE691A3-19C0-4FCF-85D2-D2371C9462C6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2BE691A3-19C0-4FCF-85D2-D2371C9462C6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B140F739-EC51-4265-B4B8-59467606E6EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B140F739-EC51-4265-B4B8-59467606E6EE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B140F739-EC51-4265-B4B8-59467606E6EE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B140F739-EC51-4265-B4B8-59467606E6EE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {00E8EE51-A263-4971-9431-C4A2DEA4993A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {00E8EE51-A263-4971-9431-C4A2DEA4993A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {00E8EE51-A263-4971-9431-C4A2DEA4993A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {00E8EE51-A263-4971-9431-C4A2DEA4993A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6B2BA282-5C97-4A71-885F-E5259274F714}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6B2BA282-5C97-4A71-885F-E5259274F714}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6B2BA282-5C97-4A71-885F-E5259274F714}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6B2BA282-5C97-4A71-885F-E5259274F714}.Release|Any CPU.Build.0 = Release|Any CPU
+ {05CF624D-F42E-461A-A21D-41BEE0CCEB5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {05CF624D-F42E-461A-A21D-41BEE0CCEB5C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {05CF624D-F42E-461A-A21D-41BEE0CCEB5C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {05CF624D-F42E-461A-A21D-41BEE0CCEB5C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C4A782C1-AA25-476B-B936-90433422D0A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C4A782C1-AA25-476B-B936-90433422D0A2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C4A782C1-AA25-476B-B936-90433422D0A2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C4A782C1-AA25-476B-B936-90433422D0A2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D9E411DD-58B1-4160-8025-068D43ADE72C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D9E411DD-58B1-4160-8025-068D43ADE72C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D9E411DD-58B1-4160-8025-068D43ADE72C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D9E411DD-58B1-4160-8025-068D43ADE72C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B2AADB36-8433-4EDB-B247-49A3EA82FE06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B2AADB36-8433-4EDB-B247-49A3EA82FE06}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B2AADB36-8433-4EDB-B247-49A3EA82FE06}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B2AADB36-8433-4EDB-B247-49A3EA82FE06}.Release|Any CPU.Build.0 = Release|Any CPU
+ {40F2A962-6209-42D0-9F21-CEACB411007B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {40F2A962-6209-42D0-9F21-CEACB411007B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {40F2A962-6209-42D0-9F21-CEACB411007B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {40F2A962-6209-42D0-9F21-CEACB411007B}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -343,14 +537,21 @@ Global
{45E2ADF5-F386-44CD-A43D-A3AB47E9C39A} = {66A85767-2877-4B99-84F1-EEABC6DC5247}
{4E99CBC5-1C74-44E7-9DEF-3FA44CADCCF0} = {66A85767-2877-4B99-84F1-EEABC6DC5247}
{04E5EDDB-8440-4BAD-9531-F87A3AC826FB} = {4E99CBC5-1C74-44E7-9DEF-3FA44CADCCF0}
- {C752DABB-74C0-4232-80CF-CE6E7A153E67} = {CC492CA2-5D86-4DB8-AB15-B118DF27C344}
{4656C609-DBBA-4F6B-B16F-5E1A8C9D9858} = {2697EEFB-06BE-4786-89C6-A566FD94A41B}
{95751DFC-B598-46B6-84BB-1B717567B886} = {445850B7-1A9D-4E9D-8AC1-765F3792DC19}
{F7925EED-65E6-4CA2-9B8D-B7036F6DB3E8} = {2697EEFB-06BE-4786-89C6-A566FD94A41B}
{D22C3F6D-434A-4F09-9EB2-B0433CC43642} = {2697EEFB-06BE-4786-89C6-A566FD94A41B}
{78C9C726-BFAB-4B31-AFCB-5A229E69DC07} = {445850B7-1A9D-4E9D-8AC1-765F3792DC19}
+ {257A0A17-5D13-4DA4-8E91-8A3BB2711F49} = {45E2ADF5-F386-44CD-A43D-A3AB47E9C39A}
+ {4A955BB3-C1AF-45DB-9590-82C00996B608} = {66A85767-2877-4B99-84F1-EEABC6DC5247}
+ {9A2C7C42-086B-4482-828D-7B02D85372ED} = {4A955BB3-C1AF-45DB-9590-82C00996B608}
+ {661B88AE-6F83-437C-9A7E-C5C1A565E650} = {45E2ADF5-F386-44CD-A43D-A3AB47E9C39A}
+ {C99E1554-5039-42BD-B1FD-93814FBEBE44} = {CC492CA2-5D86-4DB8-AB15-B118DF27C344}
{25C83DA5-BD4A-4AFA-8747-A0D16CB70500} = {199A0EFE-EE81-4A0E-9F2E-298CDDA49D26}
+ {60424AB5-356A-4623-B1FB-7560334C0BE0} = {4A955BB3-C1AF-45DB-9590-82C00996B608}
+ {C2A4E6AB-16B9-4457-9445-FFBF672DFBCF} = {4A955BB3-C1AF-45DB-9590-82C00996B608}
{AFB629C5-00C2-492C-8787-C66D810A24DB} = {7AB71D86-D351-4009-A789-24097897E74A}
+ {9E4DED9F-F404-4512-AB88-91174BD81A45} = {66A85767-2877-4B99-84F1-EEABC6DC5247}
{648CE3E3-CEC4-4F91-8696-6A3FB2F91220} = {C01B9930-D67F-41C5-90C9-C87DC53F39CB}
{9404B5FE-3431-4EC0-BCC6-42525FC5D1B8} = {648CE3E3-CEC4-4F91-8696-6A3FB2F91220}
{BB24822F-F104-4D8E-9CB5-0A94DEF04BAB} = {E6328DC1-C8F0-4DC6-941F-C6CAFFF783DF}
@@ -360,9 +561,7 @@ Global
{CA43B145-9DF2-49D3-9371-B88BFB0E846A} = {BB24822F-F104-4D8E-9CB5-0A94DEF04BAB}
{95842BB6-559E-4317-B1E9-FF19D39ADA24} = {648CE3E3-CEC4-4F91-8696-6A3FB2F91220}
{3DE7DD7A-8500-46C9-91A1-A65DB60E0235} = {648CE3E3-CEC4-4F91-8696-6A3FB2F91220}
- {9F048957-54DF-47FA-B7A1-C98825853E46} = {BB24822F-F104-4D8E-9CB5-0A94DEF04BAB}
{8618EE3F-F120-4AEA-8A77-F7BD5DCCB888} = {4E99CBC5-1C74-44E7-9DEF-3FA44CADCCF0}
- {EBD7AD52-21E3-41A0-BC74-5365A58A7778} = {CC492CA2-5D86-4DB8-AB15-B118DF27C344}
{D5CF25B2-1A91-4065-A647-06CDF55F4B96} = {C01B9930-D67F-41C5-90C9-C87DC53F39CB}
{2697EEFB-06BE-4786-89C6-A566FD94A41B} = {C01B9930-D67F-41C5-90C9-C87DC53F39CB}
{A6EB05D5-EF38-45B6-960A-0EB759373FDF} = {E6328DC1-C8F0-4DC6-941F-C6CAFFF783DF}
@@ -371,10 +570,39 @@ Global
{3ABD7B4B-37F9-4D49-92D9-384190177286} = {E6328DC1-C8F0-4DC6-941F-C6CAFFF783DF}
{577A7F6F-4836-4811-B715-32573127BDB3} = {D5CF25B2-1A91-4065-A647-06CDF55F4B96}
{04EA7A93-CDC7-4C68-815D-699180D99DCE} = {A6EB05D5-EF38-45B6-960A-0EB759373FDF}
+ {6FA4820A-DEBB-49BD-BA43-204D2477B92D} = {3E5A39C2-EEF3-40E4-A997-68D4BD65E3B1}
{A1186FB9-FB77-427C-9AEC-55E48A8D046A} = {D5CF25B2-1A91-4065-A647-06CDF55F4B96}
{9960FA8A-98C1-45FB-8A09-33CA183AA140} = {D5CF25B2-1A91-4065-A647-06CDF55F4B96}
- {F836BB0F-C5F4-4409-BDD8-C595FFD37807} = {A6EB05D5-EF38-45B6-960A-0EB759373FDF}
- {ED9522AF-9F6E-42AC-8750-1B34D8CB3716} = {A6EB05D5-EF38-45B6-960A-0EB759373FDF}
+ {E3414144-C19E-40C0-A73A-2FD41AE514D1} = {E6328DC1-C8F0-4DC6-941F-C6CAFFF783DF}
+ {1855CAB7-6379-47A4-A0A4-F890C6C46403} = {E3414144-C19E-40C0-A73A-2FD41AE514D1}
+ {C43539A5-8343-4381-B2FD-5323323F1DB6} = {4E99CBC5-1C74-44E7-9DEF-3FA44CADCCF0}
+ {D3C326CD-F1F1-4E06-962D-47F6C8090DEE} = {A6EB05D5-EF38-45B6-960A-0EB759373FDF}
+ {13690AB8-9AA4-4936-A25F-7AF1AE3D4ED0} = {A6EB05D5-EF38-45B6-960A-0EB759373FDF}
+ {244A930D-5B84-4CBC-A3A7-7E8DE1E603D6} = {CC492CA2-5D86-4DB8-AB15-B118DF27C344}
+ {0EDF10D7-D6D6-48E2-AC0C-BA6D814CB633} = {CC492CA2-5D86-4DB8-AB15-B118DF27C344}
+ {05D8A63F-B3E1-4A5E-AA66-337BCF8840C1} = {E3414144-C19E-40C0-A73A-2FD41AE514D1}
+ {3993A838-71C9-49C5-80B3-16CC48A5F5C9} = {E3414144-C19E-40C0-A73A-2FD41AE514D1}
+ {D785A240-1115-41C8-943E-5058161D6478} = {CC492CA2-5D86-4DB8-AB15-B118DF27C344}
+ {B1952639-773B-4C82-9D95-7CB4ED8AC59E} = {E3414144-C19E-40C0-A73A-2FD41AE514D1}
+ {29792C72-565A-46DF-B887-494AC5352818} = {CC492CA2-5D86-4DB8-AB15-B118DF27C344}
+ {C57D22E0-075B-4F27-87F1-E6CF5F203975} = {BB24822F-F104-4D8E-9CB5-0A94DEF04BAB}
+ {B9B66159-4FC7-4F94-8C21-ADC8CCED84F4} = {BB24822F-F104-4D8E-9CB5-0A94DEF04BAB}
+ {24FFA5F1-37CD-408B-80A9-006B5A6E11E8} = {BB24822F-F104-4D8E-9CB5-0A94DEF04BAB}
+ {6FE28297-B958-4BC5-A320-A531874D7F58} = {BB24822F-F104-4D8E-9CB5-0A94DEF04BAB}
+ {838A27C6-F125-4C61-923E-7C855B598FBD} = {BB24822F-F104-4D8E-9CB5-0A94DEF04BAB}
+ {FDE43241-3C82-4005-87B3-FD1349FEF4B6} = {CC492CA2-5D86-4DB8-AB15-B118DF27C344}
+ {878A2744-5122-48A7-90E6-7D8CFABC29FD} = {4A955BB3-C1AF-45DB-9590-82C00996B608}
+ {0C464725-DEDC-4894-84A3-7A155E43818B} = {4A955BB3-C1AF-45DB-9590-82C00996B608}
+ {AC831843-CDE2-4B67-8BC5-8F2A0D09B273} = {CC492CA2-5D86-4DB8-AB15-B118DF27C344}
+ {2BE691A3-19C0-4FCF-85D2-D2371C9462C6} = {4E99CBC5-1C74-44E7-9DEF-3FA44CADCCF0}
+ {B140F739-EC51-4265-B4B8-59467606E6EE} = {CC492CA2-5D86-4DB8-AB15-B118DF27C344}
+ {00E8EE51-A263-4971-9431-C4A2DEA4993A} = {E3414144-C19E-40C0-A73A-2FD41AE514D1}
+ {6B2BA282-5C97-4A71-885F-E5259274F714} = {4E99CBC5-1C74-44E7-9DEF-3FA44CADCCF0}
+ {05CF624D-F42E-461A-A21D-41BEE0CCEB5C} = {E3414144-C19E-40C0-A73A-2FD41AE514D1}
+ {C4A782C1-AA25-476B-B936-90433422D0A2} = {CC492CA2-5D86-4DB8-AB15-B118DF27C344}
+ {D9E411DD-58B1-4160-8025-068D43ADE72C} = {345739E2-E20C-4B1F-B1B2-725006FC9F72}
+ {B2AADB36-8433-4EDB-B247-49A3EA82FE06} = {9BFB5DBE-8F64-45A9-BDB2-BAD91D44A4C5}
+ {40F2A962-6209-42D0-9F21-CEACB411007B} = {9BFB5DBE-8F64-45A9-BDB2-BAD91D44A4C5}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {94347832-A36D-4C42-9C4D-B848BD4F5DA9}
diff --git a/build/Build.csproj b/build/Build.csproj
index 78927daa..e90b42b1 100644
--- a/build/Build.csproj
+++ b/build/Build.csproj
@@ -15,7 +15,7 @@
-
+
diff --git a/build/BuildScript.cs b/build/BuildScript.cs
index c236e286..79069a06 100644
--- a/build/BuildScript.cs
+++ b/build/BuildScript.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
+using System.Linq;
using FlubuCore.Context;
using FlubuCore.Context.Attributes.BuildProperties;
using FlubuCore.Context.FluentInterface.Interfaces;
@@ -38,7 +39,7 @@ namespace Build {
///
public FullPath SourceDir => RootDirectory.CombineWith( "../src" );
///
- /// Դ´úÂëĿ¼
+ /// ²âÊÔĿ¼
///
public FullPath TestDir => RootDirectory.CombineWith( "../test" );
///
@@ -50,9 +51,24 @@ namespace Build {
///
public List Projects { get; set; }
///
- /// ²âÊÔÏîĿÎļþÁбí
+ /// µ¥Ԫ²âÊÔÏîĿÎļþÁбí
///
- public List TestProjecs { get; set; }
+ public List UnitTestProjecs { get; set; }
+ ///
+ /// ¼¯³ɲâÊÔÏîĿÎļþÁбí
+ ///
+ public List IntegrationTestProjecs { get; set; }
+ ///
+ /// ºöÂԲâÊÔÏîĿÎļþÁбí
+ ///
+ public List IgnoreTestProjecs { get; set; }
+
+ ///
+ /// »ñȡ¼¯³ɲâÊÔÏîĿÎļþÁбí
+ ///
+ protected List GetIntegrationTestProjecs() {
+ return IntegrationTestProjecs.Where( t => IgnoreTestProjecs.Exists( p => p.FileName == t.FileName ) == false ).ToList();
+ }
///
/// ¹¹½¨ǰ²Ù×÷
@@ -60,7 +76,17 @@ namespace Build {
/// ¹¹½¨ÈÎÎñÉÏÏÂÎÄ
protected override void BeforeBuildExecution( ITaskContext context ) {
Projects = context.GetFiles( SourceDir, "*/*.csproj" );
- TestProjecs = context.GetFiles( TestDir, "*/*.csproj" );
+ UnitTestProjecs = context.GetFiles( TestDir, "*/*.Tests.csproj" );
+ IntegrationTestProjecs = context.GetFiles( TestDir, "*/*.Tests.Integration.csproj" );
+ IgnoreTestProjecs = new List();
+ AddIgnoreTestProjecs( context );
+ }
+
+ ///
+ /// Ìí¼ӺöÂԲâÊÔÏîĿÎļþÁбí
+ ///
+ private void AddIgnoreTestProjecs( ITaskContext context ) {
+ IgnoreTestProjecs.AddRange( context.GetFiles( TestDir, "*/*.Oracle.Tests.Integration.csproj" ) );
}
///
@@ -71,9 +97,9 @@ namespace Build {
var clean = Clean( context );
var restore = Restore( context, clean );
var build = Build( context, restore );
+ var test = Test( context );
var pack = Pack( context, clean );
PublishNuGetPackage( context, pack );
- Test( context );
}
///
@@ -88,30 +114,65 @@ namespace Build {
///
/// »¹ԭ°ü
///
- private ITarget Restore( ITaskContext context, ITarget target ) {
+ private ITarget Restore( ITaskContext context, params ITarget[] dependTargets ) {
return context.CreateTarget( "restore" )
.SetDescription( "Restore the solution." )
- .DependsOn( target )
+ .DependsOn( dependTargets )
.AddCoreTask( t => t.Restore() );
}
///
/// ±àÒë½â¾ö·½°¸
///
- private ITarget Build( ITaskContext context, ITarget target ) {
+ private ITarget Build( ITaskContext context, params ITarget[] dependTargets ) {
return context.CreateTarget( "compile" )
.SetDescription( "Compiles the solution." )
- .DependsOn( target )
+ .DependsOn( dependTargets )
.AddCoreTask( t => t.Build() );
}
+ ///
+ /// ÔËÐвâÊÔ
+ ///
+ private ITarget Test( ITaskContext context, params ITarget[] dependTargets ) {
+ var unitTest = UnitTest( context, dependTargets );
+ var integrationTest = IntegrationTest( context, dependTargets );
+ return context.CreateTarget( "test" )
+ .SetDescription( "Run all tests." )
+ .DependsOn( unitTest, integrationTest );
+ }
+
+ ///
+ /// ÔËÐе¥Ԫ²âÊÔ
+ ///
+ private ITarget UnitTest( ITaskContext context, params ITarget[] dependTargets ) {
+ return context.CreateTarget( "unit.test" )
+ .SetDescription( "Run unit tests." )
+ .DependsOn( dependTargets )
+ .ForEach( UnitTestProjecs, ( project, target ) => {
+ target.AddCoreTask( t => t.Test().Project( project ) );
+ } );
+ }
+
+ ///
+ /// ÔËÐм¯³ɲâÊÔ
+ ///
+ private ITarget IntegrationTest( ITaskContext context, params ITarget[] dependTargets ) {
+ return context.CreateTarget( "integration.test" )
+ .SetDescription( "Run integration tests." )
+ .DependsOn( dependTargets )
+ .ForEach( GetIntegrationTestProjecs(), ( project, target ) => {
+ target.AddCoreTask( t => t.Test().Project( project ) );
+ } );
+ }
+
///
/// ´´½¨nuget°ü
///
- private ITarget Pack( ITaskContext context, ITarget dependTarget ) {
+ private ITarget Pack( ITaskContext context, params ITarget[] dependTargets ) {
return context.CreateTarget( "pack" )
.SetDescription( "Create nuget packages." )
- .DependsOn( dependTarget )
+ .DependsOn( dependTargets )
.ForEach( Projects, ( project, target ) => {
target.AddCoreTask( t => t.Pack()
.Project( project )
@@ -123,10 +184,10 @@ namespace Build {
///
/// ·¢²¼nuget°ü
///
- private void PublishNuGetPackage( ITaskContext context, ITarget dependTarget ) {
+ private void PublishNuGetPackage( ITaskContext context, params ITarget[] dependTargets ) {
context.CreateTarget( "nuget.publish" )
.SetDescription( "Publishes nuget packages" )
- .DependsOn( dependTarget )
+ .DependsOn( dependTargets )
.Do( t => {
var packages = Directory.GetFiles( OutputDir, "*.nupkg" );
foreach ( var package in packages ) {
@@ -140,16 +201,5 @@ namespace Build {
}
} );
}
-
- ///
- /// ÔËÐвâÊÔ
- ///
- private void Test( ITaskContext context ) {
- context.CreateTarget( "test" )
- .SetDescription( "Run all tests." )
- .ForEach( TestProjecs, ( project, target ) => {
- target.AddCoreTask( t => t.Test().Project( project ) );
- } );
- }
}
}
\ No newline at end of file
diff --git a/sample/Util.WebApi.Sample/Program.cs b/sample/Util.WebApi.Sample/Program.cs
new file mode 100644
index 00000000..8008de5f
--- /dev/null
+++ b/sample/Util.WebApi.Sample/Program.cs
@@ -0,0 +1,31 @@
+using Util;
+using Util.Aop;
+using Util.Logging.Serilog;
+
+//´´½¨WebӦÓóÌÐòÉú³ÉÆ÷
+var builder = WebApplication.CreateBuilder( args );
+
+//ÅäÖ÷þÎñ
+builder.Services.AddControllers();
+builder.Services.AddEndpointsApiExplorer();
+builder.Services.AddSwaggerGen();
+
+//ÅäÖÃUtil
+builder.Host.AddUtil( options => options.UseAop()
+ .UseSerilog( t => t.AddExceptionless() )
+);
+
+//¹¹½¨WebӦÓóÌÐò
+var app = builder.Build();
+
+//ÅäÖÃÇëÇó¹ܵÀ
+if ( app.Environment.IsDevelopment() ) {
+ app.UseSwagger();
+ app.UseSwaggerUI();
+}
+app.UseHttpLogging();
+app.UseAuthorization();
+app.MapControllers();
+
+//ÔËÐÐӦÓÃ
+app.Run();
diff --git a/sample/Util.WebApi.Sample/Properties/AssemblyInfo.cs b/sample/Util.WebApi.Sample/Properties/AssemblyInfo.cs
new file mode 100644
index 00000000..071580ef
--- /dev/null
+++ b/sample/Util.WebApi.Sample/Properties/AssemblyInfo.cs
@@ -0,0 +1,2 @@
+using Microsoft.Extensions.Localization;
+[assembly: RootNamespace( "Util.WebApi" )]
\ No newline at end of file
diff --git a/sample/Util.WebApi.Sample/Properties/launchSettings.json b/sample/Util.WebApi.Sample/Properties/launchSettings.json
new file mode 100644
index 00000000..73b161b9
--- /dev/null
+++ b/sample/Util.WebApi.Sample/Properties/launchSettings.json
@@ -0,0 +1,31 @@
+{
+ "$schema": "https://json.schemastore.org/launchsettings.json",
+ "iisSettings": {
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ "iisExpress": {
+ "applicationUrl": "http://localhost:38416",
+ "sslPort": 0
+ }
+ },
+ "profiles": {
+ "Util.WebApi.Sample": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "launchUrl": "swagger",
+ "applicationUrl": "http://localhost:5173",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "launchUrl": "swagger",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/sample/Util.WebApi.Sample/Util.WebApi.Sample.csproj b/sample/Util.WebApi.Sample/Util.WebApi.Sample.csproj
new file mode 100644
index 00000000..2bb6b0f1
--- /dev/null
+++ b/sample/Util.WebApi.Sample/Util.WebApi.Sample.csproj
@@ -0,0 +1,21 @@
+
+
+
+ $(NetTargetFramework)
+ Util.WebApi
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sample/Util.WebApi.Sample/appsettings.Development.json b/sample/Util.WebApi.Sample/appsettings.Development.json
new file mode 100644
index 00000000..1b2d3baf
--- /dev/null
+++ b/sample/Util.WebApi.Sample/appsettings.Development.json
@@ -0,0 +1,8 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ }
+}
\ No newline at end of file
diff --git a/sample/Util.WebApi.Sample/appsettings.json b/sample/Util.WebApi.Sample/appsettings.json
new file mode 100644
index 00000000..a8ba5e0f
--- /dev/null
+++ b/sample/Util.WebApi.Sample/appsettings.json
@@ -0,0 +1,10 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning",
+ "Microsoft.EntityFrameworkCore": "Error"
+ }
+ },
+ "AllowedHosts": "*"
+}
\ No newline at end of file
diff --git a/solutions/Util.Data.slnf b/solutions/Util.Data.slnf
new file mode 100644
index 00000000..29198177
--- /dev/null
+++ b/solutions/Util.Data.slnf
@@ -0,0 +1,57 @@
+{
+ "solution": {
+ "path": "..\\Util.sln",
+ "projects": [
+ "benchmark\\Util.Data.Dapper.Benchmark\\Util.Data.Dapper.Benchmark.csproj",
+ "benchmark\\Util.Data.Sql.Benchmark\\Util.Data.Sql.Benchmark.csproj",
+ "build\\Build.csproj",
+ "src\\Util.Aop.AspectCore\\03-Util.Aop.AspectCore.csproj",
+ "src\\Util.Core\\01-Util.Core.csproj",
+ "src\\Util.Data.Abstractions\\05-Util.Data.Abstractions.csproj",
+ "src\\Util.Data.Core\\01-Util.Data.Core.csproj",
+ "src\\Util.Data.Dapper.All\\05-Util.Data.Dapper.All.csproj",
+ "src\\Util.Data.Dapper.Core\\01-Util.Data.Dapper.Core.csproj",
+ "src\\Util.Data.Dapper.MySql\\04-Util.Data.Dapper.MySql.csproj",
+ "src\\Util.Data.Dapper.PostgreSql\\03-Util.Data.Dapper.PostgreSql.csproj",
+ "src\\Util.Data.Dapper.SqlServer\\02-Util.Data.Dapper.SqlServer.csproj",
+ "src\\Util.Data.EntityFrameworkCore.MySql\\04-Util.Data.EntityFrameworkCore.MySql.csproj",
+ "src\\Util.Data.EntityFrameworkCore.Oracle\\06-Util.Data.EntityFrameworkCore.Oracle.csproj",
+ "src\\Util.Data.EntityFrameworkCore.PostgreSql\\03-Util.Data.EntityFrameworkCore.PostgreSql.csproj",
+ "src\\Util.Data.EntityFrameworkCore.SqlServer\\02-Util.Data.EntityFrameworkCore.SqlServer.csproj",
+ "src\\Util.Data.EntityFrameworkCore.Sqlite\\05-Util.Data.EntityFrameworkCore.Sqlite.csproj",
+ "src\\Util.Data.EntityFrameworkCore\\01-Util.Data.EntityFrameworkCore.csproj",
+ "src\\Util.Data.Metadata\\03-Util.Data.Metadata.csproj",
+ "src\\Util.Data.Sql\\02-Util.Data.Sql.csproj",
+ "src\\Util.Domain.Biz\\02-Util.Domain.Biz.csproj",
+ "src\\Util.Domain\\01-Util.Domain.csproj",
+ "src\\Util.Events\\01-Util.Events.csproj",
+ "src\\Util.Logging.Serilog.Exceptionless\\03-Util.Logging.Serilog.Exceptionless.csproj",
+ "src\\Util.Logging.Serilog\\02-Util.Logging.Serilog.csproj",
+ "src\\Util.Logging\\01-Util.Logging.csproj",
+ "src\\Util.ObjectMapping.AutoMapper\\02-Util.ObjectMapping.AutoMapper.csproj",
+ "src\\Util.Validation\\04-Util.Validation.csproj",
+ "test\\Util.Aop.AspectCore.Tests\\Util.Aop.AspectCore.Tests.csproj",
+ "test\\Util.Core.Tests.Integration\\Util.Core.Tests.Integration.csproj",
+ "test\\Util.Core.Tests\\Util.Core.Tests.csproj",
+ "test\\Util.Data.Dapper.MySql.Tests.Integration\\Util.Data.Dapper.MySql.Tests.Integration.csproj",
+ "test\\Util.Data.Dapper.PostgreSql.Tests.Integration\\Util.Data.Dapper.PostgreSql.Tests.Integration.csproj",
+ "test\\Util.Data.Dapper.SqlServer.Tests.Integration\\Util.Data.Dapper.SqlServer.Tests.Integration.csproj",
+ "test\\Util.Data.EntityFrameworkCore.MySql.Tests.Integration\\Util.Data.EntityFrameworkCore.MySql.Tests.Integration.csproj",
+ "test\\Util.Data.EntityFrameworkCore.Oracle.Tests.Integration\\Util.Data.EntityFrameworkCore.Oracle.Tests.Integration.csproj",
+ "test\\Util.Data.EntityFrameworkCore.PostgreSql.Tests.Integration\\Util.Data.EntityFrameworkCore.PostgreSql.Tests.Integration.csproj",
+ "test\\Util.Data.EntityFrameworkCore.SqlServer.Tests.Integration\\Util.Data.EntityFrameworkCore.SqlServer.Tests.Integration.csproj",
+ "test\\Util.Data.EntityFrameworkCore.Sqlite.Tests.Integration\\Util.Data.EntityFrameworkCore.Sqlite.Tests.Integration.csproj",
+ "test\\Util.Data.Sql.Tests\\Util.Data.Sql.Tests.csproj",
+ "test\\Util.Data.Tests\\Util.Data.Tests.csproj",
+ "test\\Util.Domain.Tests\\Util.Domain.Tests.csproj",
+ "test\\Util.ObjectMapping.AutoMapper.Tests\\Util.ObjectMapping.AutoMapper.Tests.csproj",
+ "test\\Util.TestShare.MySql\\Util.TestShare.MySql.csproj",
+ "test\\Util.TestShare.Oracle\\Util.TestShare.Oracle.csproj",
+ "test\\Util.TestShare.PostgreSql\\Util.TestShare.PostgreSql.csproj",
+ "test\\Util.TestShare.SqlServer\\Util.TestShare.SqlServer.csproj",
+ "test\\Util.TestShare.Sqlite\\Util.TestShare.Sqlite.csproj",
+ "test\\Util.TestShare\\Util.TestShare.csproj",
+ "test\\Util.Validation.Tests\\Util.Validation.Tests.csproj"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/solutions/Util.Localization.slnf b/solutions/Util.Localization.slnf
new file mode 100644
index 00000000..eb9a9ddc
--- /dev/null
+++ b/solutions/Util.Localization.slnf
@@ -0,0 +1,19 @@
+{
+ "solution": {
+ "path": "..\\Util.sln",
+ "projects": [
+ "build\\Build.csproj",
+ "sample\\Util.WebApi.Sample\\Util.WebApi.Sample.csproj",
+ "src\\Util.Application.WebApi\\Util.Application.WebApi.csproj",
+ "src\\Util.Application\\Util.Application.csproj",
+ "src\\Util.AspNetCore\\07-Util.AspNetCore.csproj",
+ "src\\Util.Core\\01-Util.Core.csproj",
+ "src\\Util.Localization\\04-Util.Localization.csproj",
+ "src\\Util.Validation\\05-Util.Validation.csproj",
+ "test\\Util.Core.Tests.Integration\\Util.Core.Tests.Integration.csproj",
+ "test\\Util.Core.Tests\\Util.Core.Tests.csproj",
+ "test\\Util.Localization.Resources\\Util.Localization.Resources.csproj",
+ "test\\Util.Localization.Tests.Integration\\Util.Localization.Tests.Integration.csproj"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/src/Util.Aop.AspectCore/04-Util.Aop.AspectCore.csproj b/src/Util.Aop.AspectCore/03-Util.Aop.AspectCore.csproj
similarity index 100%
rename from src/Util.Aop.AspectCore/04-Util.Aop.AspectCore.csproj
rename to src/Util.Aop.AspectCore/03-Util.Aop.AspectCore.csproj
diff --git a/src/Util.Aop.AspectCore/AopOptionsExtension.cs b/src/Util.Aop.AspectCore/AopOptionsExtension.cs
index 694f7c9e..bc7fb2d5 100644
--- a/src/Util.Aop.AspectCore/AopOptionsExtension.cs
+++ b/src/Util.Aop.AspectCore/AopOptionsExtension.cs
@@ -1,14 +1,19 @@
using System;
using AspectCore.Configuration;
+using AspectCore.DynamicProxy;
+using AspectCore.DynamicProxy.Parameters;
+using AspectCore.Extensions.AspectScope;
using AspectCore.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
using Util.Configs;
+using Util.Helpers;
namespace Util.Aop {
///
/// Aop配置项扩展
///
- public class AopOptionsExtension : IOptionsExtension {
+ public class AopOptionsExtension : OptionsExtensionBase {
///
/// Aop配置
///
@@ -23,11 +28,38 @@ namespace Util.Aop {
}
///
- /// 添加服务
+ /// 配置
///
- /// 服务集合
- public void AddServices( IServiceCollection services ) {
- services.ConfigureDynamicProxy( _configure );
+ /// 主机生成器
+ public override void Config( IHostBuilder hostBuilder ) {
+ hostBuilder.UseServiceProviderFactory( new DynamicProxyServiceProviderFactory() );
+ }
+
+ ///
+ public override void ConfigureServices( HostBuilderContext context, IServiceCollection services ) {
+ ConfigureDynamicProxy( services );
+ RegisterAspectScoped( services );
+ }
+
+ ///
+ /// 配置拦截器
+ ///
+ private void ConfigureDynamicProxy( IServiceCollection services ) {
+ services.ConfigureDynamicProxy( config => {
+ config.EnableParameterAspect();
+ config.NonAspectPredicates.Add( t => Reflection.GetTopBaseType( t.DeclaringType ).SafeString() == "Microsoft.EntityFrameworkCore.DbContext" );
+ config.NonAspectPredicates.Add( t => t.DeclaringType.SafeString().Contains( "Xunit.DependencyInjection.ITestOutputHelperAccessor" ) );
+ _configure?.Invoke( config );
+ } );
+ }
+
+ ///
+ /// 注册拦截作用域
+ ///
+ private void RegisterAspectScoped( IServiceCollection services ) {
+ services.AddScoped();
+ services.AddScoped();
+ services.AddScoped();
}
}
}
diff --git a/src/Util.Aop.AspectCore/HostBuilderExtensions.cs b/src/Util.Aop.AspectCore/HostBuilderExtensions.cs
deleted file mode 100644
index b76fec24..00000000
--- a/src/Util.Aop.AspectCore/HostBuilderExtensions.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using AspectCore.Extensions.DependencyInjection;
-using Microsoft.Extensions.Hosting;
-
-namespace Util.Aop {
- ///
- /// Aop扩展
- ///
- public static class HostBuilderExtensions {
- ///
- /// 启用拦截器
- ///
- /// 主机生成器
- public static IHostBuilder EnableAop( this IHostBuilder builder ) {
- builder.UseServiceProviderFactory( new DynamicProxyServiceProviderFactory() );
- builder.ConfigureServices( ( context, services ) => services.AddAop() );
- return builder;
- }
- }
-}
diff --git a/src/Util.Aop.AspectCore/OptionsExtensions.cs b/src/Util.Aop.AspectCore/OptionsExtensions.cs
index aa2f39ba..3d1cf918 100644
--- a/src/Util.Aop.AspectCore/OptionsExtensions.cs
+++ b/src/Util.Aop.AspectCore/OptionsExtensions.cs
@@ -8,12 +8,12 @@ namespace Util.Aop {
///
public static class OptionsExtensions {
///
- /// 配置拦截器
+ /// 启用AspectCore拦截器
///
/// 配置项
- /// Aop配置
- public static Options UseAop( this Options options, Action configure = null ) {
- options.AddExtension( new AopOptionsExtension( configure ) );
+ /// AspectCore拦截器配置操作
+ public static Options UseAop( this Options options, Action setupAction = null ) {
+ options.AddExtension( new AopOptionsExtension( setupAction ) );
return options;
}
}
diff --git a/src/Util.Aop.AspectCore/ServiceCollectionExtensions.cs b/src/Util.Aop.AspectCore/ServiceCollectionExtensions.cs
deleted file mode 100644
index 03da5f80..00000000
--- a/src/Util.Aop.AspectCore/ServiceCollectionExtensions.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-using AspectCore.DynamicProxy;
-using AspectCore.DynamicProxy.Parameters;
-using AspectCore.Extensions.AspectScope;
-using AspectCore.Extensions.DependencyInjection;
-using Microsoft.Extensions.DependencyInjection;
-using Util.Helpers;
-
-namespace Util.Aop {
- ///
- /// 服务扩展
- ///
- public static class ServiceCollectionExtensions {
- ///
- /// 注册AspectCore Aop服务
- ///
- /// 服务集合
- public static IServiceCollection AddAop( this IServiceCollection services ) {
- ConfigureDynamicProxy( services );
- RegisterAspectScoped( services );
- return services;
- }
-
- ///
- /// 配置拦截器
- ///
- private static void ConfigureDynamicProxy( IServiceCollection services ) {
- services.ConfigureDynamicProxy( config => {
- config.EnableParameterAspect();
- config.NonAspectPredicates.Add( t => Reflection.GetTopBaseType( t.DeclaringType ).SafeString() == "Microsoft.EntityFrameworkCore.DbContext" );
- config.NonAspectPredicates.Add( t => t.DeclaringType.SafeString().Contains( "Xunit.DependencyInjection.ITestOutputHelperAccessor" ) );
- } );
- }
-
- ///
- /// 注册拦截作用域
- ///
- private static void RegisterAspectScoped( IServiceCollection services ) {
- services.AddScoped();
- services.AddScoped();
- services.AddScoped();
- }
- }
-}
diff --git a/src/Util.Application.EntityFrameworkCore/CrudServiceBase.cs b/src/Util.Application.EntityFrameworkCore/CrudServiceBase.cs
index 48ff36c3..9526c957 100644
--- a/src/Util.Application.EntityFrameworkCore/CrudServiceBase.cs
+++ b/src/Util.Application.EntityFrameworkCore/CrudServiceBase.cs
@@ -153,7 +153,7 @@ namespace Util.Applications {
public virtual async Task UpdateAsync( TUpdateRequest request ) {
request.CheckNull( nameof( request ) );
if( request.Id.IsEmpty() )
- throw new InvalidOperationException( UtilCoreResource.IdIsEmpty );
+ throw new InvalidOperationException( R.IdIsEmpty );
var oldEntity = await FindOldEntityAsync( request.Id );
oldEntity.CheckNull( nameof( oldEntity ) );
var entity = ToEntity( oldEntity, request );
diff --git a/src/Util.Application.WebApi/Controllers/QueryControllerBase.cs b/src/Util.Application.WebApi/Controllers/QueryControllerBase.cs
index 762cc84b..34471436 100644
--- a/src/Util.Application.WebApi/Controllers/QueryControllerBase.cs
+++ b/src/Util.Application.WebApi/Controllers/QueryControllerBase.cs
@@ -59,7 +59,7 @@ namespace Util.Applications.Controllers {
///
/// 查询参数
protected async Task QueryAsync( TQuery query ) {
- if( query == null )
+ if ( query == null )
return Fail( WebApiResource.QueryIsEmpty );
QueryBefore( query );
var list = await _service.QueryAsync( query );
@@ -91,7 +91,7 @@ namespace Util.Applications.Controllers {
///
/// 查询参数
protected async Task PageQueryAsync( TQuery query ) {
- if( query == null )
+ if ( query == null )
return Fail( WebApiResource.QueryIsEmpty );
PageQueryBefore( query );
var pageList = await _service.PageQueryAsync( query );
@@ -123,7 +123,7 @@ namespace Util.Applications.Controllers {
///
/// 查询参数
protected async Task GetItemsAsync( TQuery query ) {
- if( query == null )
+ if ( query == null )
return Fail( WebApiResource.QueryIsEmpty );
var pageList = await _service.PageQueryAsync( query );
var result = pageList.Data.Select( ToItem );
diff --git a/src/Util.Application.WebApi/Controllers/WebApiControllerBase.cs b/src/Util.Application.WebApi/Controllers/WebApiControllerBase.cs
index 9b0c5c8a..2f321b03 100644
--- a/src/Util.Application.WebApi/Controllers/WebApiControllerBase.cs
+++ b/src/Util.Application.WebApi/Controllers/WebApiControllerBase.cs
@@ -1,5 +1,5 @@
-using System.Net;
-using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.DependencyInjection;
using Util.Applications.Filters;
using Util.Properties;
@@ -18,9 +18,19 @@ namespace Util.Applications.Controllers {
/// 数据
/// 消息
/// Http状态码
- protected virtual IActionResult Success( dynamic data = null, string message = null, HttpStatusCode? statusCode = HttpStatusCode.OK ) {
+ protected virtual IActionResult Success( dynamic data = null, string message = null, int? statusCode = 200 ) {
message ??= R.Success;
- return new Result( StateCode.Ok, message, data, statusCode );
+ return GetResult( StateCode.Ok, message, data, statusCode );
+ }
+
+ ///
+ /// 获取结果
+ ///
+ private IActionResult GetResult( string code, string message, dynamic data, int? httpStatusCode ) {
+ var resultFactory = HttpContext.RequestServices.GetService();
+ if ( resultFactory == null )
+ return new Result( code, message, data, httpStatusCode );
+ return resultFactory.CreateResult( code, message, data, httpStatusCode );
}
///
@@ -28,8 +38,8 @@ namespace Util.Applications.Controllers {
///
/// 消息
/// Http状态码
- protected virtual IActionResult Fail( string message, HttpStatusCode? statusCode = null ) {
- return new Result( StateCode.Fail, message, null, statusCode );
+ protected virtual IActionResult Fail( string message, int? statusCode = 200 ) {
+ return GetResult( StateCode.Fail, message, null, statusCode );
}
}
}
diff --git a/src/Util.Application.WebApi/Filters/ExceptionHandlerAttribute.cs b/src/Util.Application.WebApi/Filters/ExceptionHandlerAttribute.cs
index 210cf59e..2317b5e1 100644
--- a/src/Util.Application.WebApi/Filters/ExceptionHandlerAttribute.cs
+++ b/src/Util.Application.WebApi/Filters/ExceptionHandlerAttribute.cs
@@ -1,5 +1,9 @@
-using Microsoft.AspNetCore.Mvc.Filters;
+using System.Reflection;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Localization;
using Util.Helpers;
namespace Util.Applications.Filters {
@@ -12,8 +16,40 @@ namespace Util.Applications.Filters {
///
public override void OnException( ExceptionContext context ) {
context.ExceptionHandled = true;
- context.HttpContext.Response.StatusCode = 200;
- context.Result = new Result( StateCode.Fail, context.Exception.GetPrompt( Web.Environment.IsProduction() ) );
+ var message = context.Exception.GetPrompt( Web.Environment.IsProduction() );
+ message = GetLocalizedMessages( context, message );
+ var errorCode = context.Exception.GetErrorCode() ?? StateCode.Fail;
+ var httpStatusCode = context.Exception.GetHttpStatusCode() ?? 200;
+ context.Result = GetResult( context, errorCode, message, httpStatusCode );
+ }
+
+ ///
+ /// 获取本地化异常消息
+ ///
+ protected virtual string GetLocalizedMessages( ExceptionContext context, string message ) {
+ var stringLocalizerFactory = context.HttpContext.RequestServices.GetService();
+ if ( stringLocalizerFactory == null )
+ return message;
+ var assemblyName = new AssemblyName( GetType().Assembly.FullName );
+ var stringLocalizer = stringLocalizerFactory.Create( "Warning", assemblyName.Name );
+ var localizedString = stringLocalizer[message];
+ if ( localizedString.ResourceNotFound == false )
+ return localizedString.Value;
+ stringLocalizer = context.HttpContext.RequestServices.GetService();
+ if ( stringLocalizer == null )
+ return message;
+ return stringLocalizer[message];
+ }
+
+
+ ///
+ /// 获取结果
+ ///
+ protected virtual IActionResult GetResult( ExceptionContext context, string code, string message, int? httpStatusCode ) {
+ var resultFactory = context.HttpContext.RequestServices.GetService();
+ if ( resultFactory == null )
+ return new Result( code, message, null, httpStatusCode );
+ return resultFactory.CreateResult( code, message, null, httpStatusCode );
}
}
}
diff --git a/src/Util.Application.WebApi/IResultFactory.cs b/src/Util.Application.WebApi/IResultFactory.cs
new file mode 100644
index 00000000..7e346fdb
--- /dev/null
+++ b/src/Util.Application.WebApi/IResultFactory.cs
@@ -0,0 +1,18 @@
+using Microsoft.AspNetCore.Mvc;
+using Util.Dependency;
+
+namespace Util.Applications {
+ ///
+ /// 返回结果工厂
+ ///
+ public interface IResultFactory : ISingletonDependency {
+ ///
+ /// 创建返回结果
+ ///
+ /// 业务状态码
+ /// 消息
+ /// 数据
+ /// Http状态码
+ IActionResult CreateResult( string code, string message, dynamic data, int? httpStatusCode );
+ }
+}
diff --git a/src/Util.Application.WebApi/Infrastructure/WebApiServiceRegistrar.cs b/src/Util.Application.WebApi/Infrastructure/WebApiServiceRegistrar.cs
index e4fd6c76..f774cf34 100644
--- a/src/Util.Application.WebApi/Infrastructure/WebApiServiceRegistrar.cs
+++ b/src/Util.Application.WebApi/Infrastructure/WebApiServiceRegistrar.cs
@@ -1,7 +1,8 @@
using System;
using Microsoft.AspNetCore.Hosting;
-using Microsoft.Extensions.Configuration;
+using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
using Util.Applications.Logging;
using Util.Infrastructure;
using Util.Logging;
@@ -30,12 +31,14 @@ namespace Util.Applications.Infrastructure {
///
/// 注册服务
///
- /// 服务集合
- /// 配置
+ /// 主机生成器
/// 类型查找器
- public Action Register( IServiceCollection services, IConfiguration configuration, ITypeFinder finder ) {
- services.AddSingleton();
- services.AddSingleton();
+ public Action Register( IHostBuilder hostBuilder, ITypeFinder finder ) {
+ hostBuilder.ConfigureServices( ( context, services ) => {
+ services.AddSingleton();
+ services.AddSingleton();
+ services.Configure( options => options.SuppressModelStateInvalidFilter = true );
+ } );
return null;
}
}
diff --git a/src/Util.Application.WebApi/Result.cs b/src/Util.Application.WebApi/Result.cs
index ada8ad7c..656c144b 100644
--- a/src/Util.Application.WebApi/Result.cs
+++ b/src/Util.Application.WebApi/Result.cs
@@ -1,6 +1,9 @@
-using System.Net;
+using System.Text.Encodings.Web;
+using System.Text.Json;
+using System.Text.Unicode;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
+using Util.SystemTextJson;
namespace Util.Applications {
///
@@ -8,9 +11,9 @@ namespace Util.Applications {
///
public class Result : JsonResult {
///
- /// 状态码
+ /// 业务状态码
///
- public StateCode Code { get; }
+ public string Code { get; }
///
/// 消息
///
@@ -23,18 +26,23 @@ namespace Util.Applications {
///
/// 初始化返回结果
///
- /// 状态码
+ /// 业务状态码
/// 消息
/// 数据
/// Http状态码
- public Result( StateCode code, string message, dynamic data = null, HttpStatusCode? httpStatusCode = null ) : base( null ) {
+ public Result( string code, string message, dynamic data, int? httpStatusCode ) : base( null ) {
Code = code;
Message = message;
Data = data;
- var statusCode = Util.Helpers.Enum.GetValue( httpStatusCode );
- if ( statusCode == null )
- return;
- StatusCode = statusCode;
+ SerializerSettings = new JsonSerializerOptions {
+ PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
+ Encoder = JavaScriptEncoder.Create( UnicodeRanges.All ),
+ Converters = {
+ new DateTimeJsonConverter(),
+ new NullableDateTimeJsonConverter()
+ }
+ };
+ StatusCode = httpStatusCode;
}
///
@@ -42,7 +50,7 @@ namespace Util.Applications {
///
public override Task ExecuteResultAsync( ActionContext context ) {
Value = new {
- Code = Code.Value(),
+ Code,
Message,
Data
};
diff --git a/src/Util.Application.WebApi/Util.Application.WebApi.csproj b/src/Util.Application.WebApi/Util.Application.WebApi.csproj
index 15de3340..fd5cd34f 100644
--- a/src/Util.Application.WebApi/Util.Application.WebApi.csproj
+++ b/src/Util.Application.WebApi/Util.Application.WebApi.csproj
@@ -28,7 +28,7 @@
-
+
diff --git a/src/Util.Application/Dtos/RequestBase.cs b/src/Util.Application/Dtos/RequestBase.cs
index 80eb8eda..3a5822ff 100644
--- a/src/Util.Application/Dtos/RequestBase.cs
+++ b/src/Util.Application/Dtos/RequestBase.cs
@@ -1,5 +1,8 @@
using System.Linq;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
using Util.Exceptions;
+using Util.Helpers;
using Util.Validation;
namespace Util.Applications.Dtos {
@@ -11,10 +14,18 @@ namespace Util.Applications.Dtos {
/// 验证
///
public virtual ValidationResultCollection Validate() {
- var result = DataAnnotationValidation.Validate( this );
- if( result.IsValid )
+ var validator = Ioc.Create();
+ if ( validator == null ) {
+ var result = DataAnnotationValidation.Validate( this );
+ if ( result.IsValid )
+ return ValidationResultCollection.Success;
+ throw new Warning( result.First().ErrorMessage );
+ }
+ var actionContext = new ActionContext();
+ validator.Validate( actionContext, null, string.Empty, this );
+ if ( actionContext.ModelState.IsValid )
return ValidationResultCollection.Success;
- throw new Warning( result.First().ErrorMessage );
+ throw new Warning( actionContext.ModelState.Values.First().Errors.First().ErrorMessage );
}
}
}
diff --git a/src/Util.Application/ExceptionExtensions.cs b/src/Util.Application/ExceptionExtensions.cs
index 40fb78c3..530deab6 100644
--- a/src/Util.Application/ExceptionExtensions.cs
+++ b/src/Util.Application/ExceptionExtensions.cs
@@ -37,5 +37,35 @@ namespace Util.Applications {
return warning.GetMessage();
return isProduction ? R.SystemError : exception.Message;
}
+
+ ///
+ /// 获取Http状态码
+ ///
+ /// 异常
+ public static int? GetHttpStatusCode( this Exception exception ) {
+ if ( exception == null )
+ return null;
+ exception = exception.GetRawException();
+ if ( exception == null )
+ return null;
+ if ( exception is Warning warning )
+ return warning.HttpStatusCode;
+ return null;
+ }
+
+ ///
+ /// 获取错误码
+ ///
+ /// 异常
+ public static string GetErrorCode( this Exception exception ) {
+ if ( exception == null )
+ return null;
+ exception = exception.GetRawException();
+ if ( exception == null )
+ return null;
+ if ( exception is Warning warning )
+ return warning.Code;
+ return null;
+ }
}
}
diff --git a/src/Util.Application/StateCode.cs b/src/Util.Application/StateCode.cs
index 0a7bce89..b3aebce8 100644
--- a/src/Util.Application/StateCode.cs
+++ b/src/Util.Application/StateCode.cs
@@ -1,15 +1,15 @@
namespace Util.Applications {
///
- /// 状态码
+ /// 业务状态码
///
- public enum StateCode {
+ public static class StateCode {
///
/// 失败
///
- Fail = 0,
+ public const string Fail = "0";
///
/// 成功
///
- Ok = 1
+ public const string Ok = "1";
}
}
diff --git a/src/Util.Application/Util.Application.csproj b/src/Util.Application/Util.Application.csproj
index 95fbd9c5..2af2a266 100644
--- a/src/Util.Application/Util.Application.csproj
+++ b/src/Util.Application/Util.Application.csproj
@@ -27,6 +27,7 @@
+
diff --git a/src/Util.AspNetCore/02-Util.AspNetCore.csproj b/src/Util.AspNetCore/07-Util.AspNetCore.csproj
similarity index 100%
rename from src/Util.AspNetCore/02-Util.AspNetCore.csproj
rename to src/Util.AspNetCore/07-Util.AspNetCore.csproj
diff --git a/src/Util.AspNetCore/Helpers/Web.cs b/src/Util.AspNetCore/Helpers/Web.cs
index 1ef4ab2d..2fc4bf88 100644
--- a/src/Util.AspNetCore/Helpers/Web.cs
+++ b/src/Util.AspNetCore/Helpers/Web.cs
@@ -104,5 +104,17 @@ namespace Util.Helpers {
public static IHttpClient Client => Ioc.Create();
#endregion
+
+ #region GetPhysicalPath(获取物理路径)
+
+ ///
+ /// 获取物理路径,基路径为IWebHostEnvironment.ContentRootPath
+ ///
+ /// 相对路径,范例:"test/a.txt" 或 "/test/a.txt"
+ public static string GetPhysicalPath( string relativePath ) {
+ return Platform.GetPhysicalPath( relativePath, Environment.ContentRootPath );
+ }
+
+ #endregion
}
}
diff --git a/src/Util.AspNetCore/Http/HttpRequest.cs b/src/Util.AspNetCore/Http/HttpRequest.cs
index b3769014..a3b1f64e 100644
--- a/src/Util.AspNetCore/Http/HttpRequest.cs
+++ b/src/Util.AspNetCore/Http/HttpRequest.cs
@@ -5,9 +5,11 @@ using System.Net.Http;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Text.Json;
+using System.Text.Json.Serialization;
using System.Threading.Tasks;
using Microsoft.AspNetCore.WebUtilities;
using Util.Helpers;
+using Util.SystemTextJson;
namespace Util.Http {
///
@@ -438,7 +440,7 @@ namespace Util.Http {
/// 获取json内容值
///
private string GetJsonContentValue() {
- var options = new JsonSerializerOptions { IgnoreNullValues = true };
+ var options = new JsonSerializerOptions { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull };
if( Param != null && Params.Count > 0 )
return Json.ToJson( GetParameters(), options );
if( Param != null )
@@ -582,7 +584,13 @@ namespace Util.Http {
if( typeof( TResult ) == typeof( string ) )
return (TResult)(object)content;
if( contentType.SafeString().ToLower() == "application/json" ) {
- var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
+ var options = new JsonSerializerOptions {
+ PropertyNameCaseInsensitive = true,
+ Converters = {
+ new DateTimeJsonConverter(),
+ new NullableDateTimeJsonConverter()
+ }
+ };
return Json.ToObject( content, options );
}
return null;
diff --git a/src/Util.AspNetCore/Infrastructure/AspNetCoreServiceRegistrar.cs b/src/Util.AspNetCore/Infrastructure/AspNetCoreServiceRegistrar.cs
index 1da1bb25..b3e296a0 100644
--- a/src/Util.AspNetCore/Infrastructure/AspNetCoreServiceRegistrar.cs
+++ b/src/Util.AspNetCore/Infrastructure/AspNetCoreServiceRegistrar.cs
@@ -1,8 +1,8 @@
using System;
using Microsoft.AspNetCore.Http;
-using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
+using Microsoft.Extensions.Hosting;
using Util.Helpers;
using Util.Http;
using Util.Reflections;
@@ -30,15 +30,16 @@ namespace Util.Infrastructure {
///
/// 注册服务
///
- /// 服务集合
- /// 配置
+ /// 主机生成器
/// 类型查找器
- public Action Register( IServiceCollection services, IConfiguration configuration, ITypeFinder finder ) {
- RegisterHttpContextAccessor( services );
- services.AddHttpClient();
- RegisterServiceLocator();
- RegisterSession( services );
- RegisterHttpClient( services );
+ public Action Register( IHostBuilder hostBuilder, ITypeFinder finder ) {
+ hostBuilder.ConfigureServices( ( context, services ) => {
+ RegisterHttpContextAccessor( services );
+ services.AddHttpClient();
+ RegisterServiceLocator();
+ RegisterSession( services );
+ RegisterHttpClient( services );
+ } );
return null;
}
diff --git a/src/Util.AspNetCore/Security/DataProtectionEncryptor.cs b/src/Util.AspNetCore/Security/DataProtectionEncryptor.cs
new file mode 100644
index 00000000..485d9214
--- /dev/null
+++ b/src/Util.AspNetCore/Security/DataProtectionEncryptor.cs
@@ -0,0 +1,36 @@
+using System;
+using Microsoft.AspNetCore.DataProtection;
+
+namespace Util.Security {
+ ///
+ /// 基于数据保护提供程序的加密器
+ ///
+ public class DataProtectionEncryptor : IEncryptor {
+ ///
+ /// 数据保护器
+ ///
+ private readonly IDataProtector _dataProtector;
+
+ ///
+ /// 初始化加密器
+ ///
+ /// 数据保护器
+ public DataProtectionEncryptor( IDataProtector dataProtector ) {
+ _dataProtector = dataProtector ?? throw new ArgumentNullException( nameof( dataProtector ) );
+ }
+
+ ///
+ public string Encrypt( string data ) {
+ if ( data.IsEmpty() )
+ return null;
+ return _dataProtector.Protect( data );
+ }
+
+ ///
+ public string Decrypt( string data ) {
+ if ( data.IsEmpty() )
+ return null;
+ return _dataProtector.Unprotect( data );
+ }
+ }
+}
diff --git a/src/Util.Core/01-Util.Core.csproj b/src/Util.Core/01-Util.Core.csproj
index 58e74aba..e523601e 100644
--- a/src/Util.Core/01-Util.Core.csproj
+++ b/src/Util.Core/01-Util.Core.csproj
@@ -27,12 +27,13 @@
-
+
-
+
+
@@ -43,11 +44,6 @@
True
R.resx
-
- True
- True
- UtilCoreResource.resx
-
@@ -55,10 +51,6 @@
PublicResXFileCodeGenerator
R.Designer.cs
-
- PublicResXFileCodeGenerator
- UtilCoreResource.Designer.cs
-
diff --git a/src/Util.Core/Configs/IOptionsExtension.cs b/src/Util.Core/Configs/IOptionsExtension.cs
index 7da31e8b..a146c00a 100644
--- a/src/Util.Core/Configs/IOptionsExtension.cs
+++ b/src/Util.Core/Configs/IOptionsExtension.cs
@@ -1,4 +1,6 @@
-using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
namespace Util.Configs {
///
@@ -6,9 +8,21 @@ namespace Util.Configs {
///
public interface IOptionsExtension {
///
- /// 添加服务集合
+ /// 配置服务
///
+ /// 主机生成器上下文
/// 服务集合
- void AddServices( IServiceCollection services );
+ void ConfigureServices( HostBuilderContext context, IServiceCollection services );
+ ///
+ /// 配置应用
+ ///
+ /// 主机生成器上下文
+ /// 配置生成器
+ void ConfigureAppConfiguration( HostBuilderContext context, IConfigurationBuilder configurationBuilder );
+ ///
+ /// 配置
+ ///
+ /// 主机生成器
+ void Config( IHostBuilder hostBuilder );
}
}
diff --git a/src/Util.Core/Configs/OptionsBase.cs b/src/Util.Core/Configs/OptionsBase.cs
index 9afb5dc1..ece263cf 100644
--- a/src/Util.Core/Configs/OptionsBase.cs
+++ b/src/Util.Core/Configs/OptionsBase.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
namespace Util.Configs {
///
@@ -23,8 +22,7 @@ namespace Util.Configs {
///
/// 配置项扩展
public void AddExtension( IOptionsExtension extension ) {
- if( extension == null )
- throw new ArgumentNullException( nameof( extension ) );
+ extension.CheckNull( nameof( extension ) );
Extensions.Add( extension );
}
}
diff --git a/src/Util.Core/Configs/OptionsExtensionBase.cs b/src/Util.Core/Configs/OptionsExtensionBase.cs
new file mode 100644
index 00000000..d02f2f40
--- /dev/null
+++ b/src/Util.Core/Configs/OptionsExtensionBase.cs
@@ -0,0 +1,22 @@
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+
+namespace Util.Configs {
+ ///
+ /// 配置项扩展
+ ///
+ public abstract class OptionsExtensionBase : IOptionsExtension {
+ ///
+ public virtual void ConfigureServices( HostBuilderContext context, IServiceCollection services ) {
+ }
+
+ ///
+ public virtual void ConfigureAppConfiguration( HostBuilderContext context, IConfigurationBuilder configurationBuilder ) {
+ }
+
+ ///
+ public virtual void Config( IHostBuilder hostBuilder ) {
+ }
+ }
+}
diff --git a/src/Util.Core/Configs/PreOptions.cs b/src/Util.Core/Configs/PreOptions.cs
new file mode 100644
index 00000000..5ef8fba4
--- /dev/null
+++ b/src/Util.Core/Configs/PreOptions.cs
@@ -0,0 +1,7 @@
+namespace Util.Configs {
+ ///
+ /// 前置服务配置项
+ ///
+ public class PreOptions : OptionsBase {
+ }
+}
diff --git a/src/Util.Core/DateTimeExtensions.cs b/src/Util.Core/DateTimeExtensions.cs
index 949336f8..80659af6 100644
--- a/src/Util.Core/DateTimeExtensions.cs
+++ b/src/Util.Core/DateTimeExtensions.cs
@@ -1,5 +1,6 @@
using System;
using System.Text;
+using Util.Helpers;
using Util.Properties;
namespace Util {
@@ -13,11 +14,22 @@ namespace Util {
/// 日期
/// 是否移除秒
public static string ToDateTimeString( this DateTime dateTime, bool removeSecond = false ) {
- if( removeSecond )
+ dateTime = GetLocalDateTime( dateTime );
+ if ( removeSecond )
return dateTime.ToString( "yyyy-MM-dd HH:mm" );
return dateTime.ToString( "yyyy-MM-dd HH:mm:ss" );
}
+ ///
+ /// 获取本地日期
+ ///
+ private static DateTime GetLocalDateTime( DateTime dateTime ) {
+ dateTime = Time.Normalize( dateTime );
+ if ( dateTime.Kind == DateTimeKind.Utc )
+ return dateTime.ToLocalTime();
+ return dateTime;
+ }
+
///
/// 获取格式化字符串,带时分秒,格式:"yyyy-MM-dd HH:mm:ss"
///
@@ -34,6 +46,7 @@ namespace Util {
///
/// 日期
public static string ToDateString( this DateTime dateTime ) {
+ dateTime = GetLocalDateTime( dateTime );
return dateTime.ToString( "yyyy-MM-dd" );
}
@@ -52,6 +65,7 @@ namespace Util {
///
/// 日期
public static string ToTimeString( this DateTime dateTime ) {
+ dateTime = GetLocalDateTime( dateTime );
return dateTime.ToString( "HH:mm:ss" );
}
@@ -70,6 +84,7 @@ namespace Util {
///
/// 日期
public static string ToMillisecondString( this DateTime dateTime ) {
+ dateTime = GetLocalDateTime( dateTime );
return dateTime.ToString( "yyyy-MM-dd HH:mm:ss.fff" );
}
@@ -88,6 +103,7 @@ namespace Util {
///
/// 日期
public static string ToChineseDateString( this DateTime dateTime ) {
+ dateTime = GetLocalDateTime( dateTime );
return $"{dateTime.Year}年{dateTime.Month}月{dateTime.Day}日";
}
@@ -107,6 +123,7 @@ namespace Util {
/// 日期
/// 是否移除秒
public static string ToChineseDateTimeString( this DateTime dateTime, bool removeSecond = false ) {
+ dateTime = GetLocalDateTime( dateTime );
StringBuilder result = new StringBuilder();
result.AppendFormat( "{0}年{1}月{2}日", dateTime.Year, dateTime.Month, dateTime.Day );
result.AppendFormat( " {0}时{1}分", dateTime.Hour, dateTime.Minute );
@@ -134,27 +151,27 @@ namespace Util {
StringBuilder result = new StringBuilder();
if ( timeSpan.Days > 0 ) {
result.Append( timeSpan.Days );
- result.Append( UtilCoreResource.Days );
+ result.Append( R.Days );
}
if ( timeSpan.Hours > 0 ) {
result.Append( timeSpan.Hours );
- result.Append( UtilCoreResource.Hours );
+ result.Append( R.Hours );
}
if ( timeSpan.Minutes > 0 ) {
result.Append( timeSpan.Minutes );
- result.Append( UtilCoreResource.Minutes );
+ result.Append( R.Minutes );
}
if ( timeSpan.Seconds > 0 ) {
result.Append( timeSpan.Seconds );
- result.Append( UtilCoreResource.Seconds );
+ result.Append( R.Seconds );
}
if ( timeSpan.Milliseconds > 0 ) {
result.Append( timeSpan.Milliseconds );
- result.Append( UtilCoreResource.Milliseconds );
+ result.Append( R.Milliseconds );
}
if ( result.Length > 0 )
return result.ToString();
- return $"{timeSpan.TotalMilliseconds}{UtilCoreResource.Milliseconds}";
+ return $"{timeSpan.TotalMilliseconds}{R.Milliseconds}";
}
}
}
diff --git a/src/Util.Core/Dates/OptionsExtensions.cs b/src/Util.Core/Dates/OptionsExtensions.cs
new file mode 100644
index 00000000..4d718a7f
--- /dev/null
+++ b/src/Util.Core/Dates/OptionsExtensions.cs
@@ -0,0 +1,18 @@
+using Util.Configs;
+
+namespace Util.Dates {
+ ///
+ /// 日期操作扩展
+ ///
+ public static class OptionsExtensions {
+ ///
+ /// 使用Utc日期
+ ///
+ /// 配置项
+ /// 是否使用Utc日期
+ public static Options UseUtc( this Options options, bool isUseUtc = true ) {
+ TimeOptions.IsUseUtc = isUseUtc;
+ return options;
+ }
+ }
+}
diff --git a/src/Util.Core/Dates/TimeOptions.cs b/src/Util.Core/Dates/TimeOptions.cs
new file mode 100644
index 00000000..c670eb1f
--- /dev/null
+++ b/src/Util.Core/Dates/TimeOptions.cs
@@ -0,0 +1,11 @@
+namespace Util.Dates {
+ ///
+ /// 时间配置
+ ///
+ public static class TimeOptions {
+ ///
+ /// 是否使用Utc日期
+ ///
+ public static bool IsUseUtc { get; set; } = false;
+ }
+}
diff --git a/src/Util.Core/Exceptions/ConcurrencyException.cs b/src/Util.Core/Exceptions/ConcurrencyException.cs
index f854e488..2011130e 100644
--- a/src/Util.Core/Exceptions/ConcurrencyException.cs
+++ b/src/Util.Core/Exceptions/ConcurrencyException.cs
@@ -18,14 +18,6 @@ namespace Util.Exceptions {
: this( "" ) {
}
- ///
- /// 初始化并发异常
- ///
- /// 错误消息
- public ConcurrencyException( string message )
- : this( message, null ) {
- }
-
///
/// 初始化并发异常
///
@@ -34,29 +26,21 @@ namespace Util.Exceptions {
: this( "", exception ) {
}
- ///
- /// 初始化并发异常
- ///
- /// 错误消息
- /// 异常
- public ConcurrencyException( string message, Exception exception )
- : this( message, exception, "" ) {
- }
-
///
/// 初始化并发异常
///
/// 错误消息
/// 异常
/// 错误码
- public ConcurrencyException( string message, Exception exception, string code )
- : base( message, code, exception ) {
+ /// Http状态码
+ public ConcurrencyException( string message, Exception exception = null, string code = null, int? httpStatusCode = null )
+ : base( message, exception, code, httpStatusCode ) {
_message = message;
}
///
/// 错误消息
///
- public override string Message => $"{UtilCoreResource.ConcurrencyExceptionMessage}.{_message}";
+ public override string Message => $"{R.ConcurrencyExceptionMessage}.{_message}";
}
}
diff --git a/src/Util.Core/Exceptions/Warning.cs b/src/Util.Core/Exceptions/Warning.cs
index b5f9ad47..ed0f4995 100644
--- a/src/Util.Core/Exceptions/Warning.cs
+++ b/src/Util.Core/Exceptions/Warning.cs
@@ -7,29 +7,12 @@ namespace Util.Exceptions {
/// 应用程序异常
///
public class Warning : Exception {
- ///
- /// 初始化应用程序异常
- ///
- /// 错误消息
- public Warning( string message )
- : this( message, null ) {
- }
-
///
/// 初始化应用程序异常
///
/// 异常
public Warning( Exception exception )
- : this( null, null, exception ) {
- }
-
- ///
- /// 初始化应用程序异常
- ///
- /// 错误消息
- /// 错误码
- public Warning( string message, string code )
- : this( message, code, null ) {
+ : this( null, exception ) {
}
///
@@ -38,9 +21,11 @@ namespace Util.Exceptions {
/// 错误消息
/// 错误码
/// 异常
- public Warning( string message, string code, Exception exception )
+ /// Http状态码
+ public Warning( string message, Exception exception = null, string code = null, int? httpStatusCode = null )
: base( message ?? "", exception ) {
Code = code;
+ HttpStatusCode = httpStatusCode;
}
///
@@ -48,6 +33,11 @@ namespace Util.Exceptions {
///
public string Code { get; set; }
+ ///
+ /// Http状态码
+ ///
+ public int? HttpStatusCode { get; set; }
+
///
/// 获取错误消息
///
diff --git a/src/Util.Core/Helpers/Common.cs b/src/Util.Core/Helpers/Common.cs
index b9e0cf95..74d137da 100644
--- a/src/Util.Core/Helpers/Common.cs
+++ b/src/Util.Core/Helpers/Common.cs
@@ -8,7 +8,7 @@ namespace Util.Helpers {
///
/// 换行符
///
- public static string Line => Environment.NewLine;
+ public static string Line => System.Environment.NewLine;
///
/// 获取类型
diff --git a/src/Util.Core/Helpers/Config.cs b/src/Util.Core/Helpers/Config.cs
index 4a2834d7..7dd84601 100644
--- a/src/Util.Core/Helpers/Config.cs
+++ b/src/Util.Core/Helpers/Config.cs
@@ -23,44 +23,44 @@ namespace Util.Helpers {
///
/// 配置选项类型
/// 配置节
- /// 配置文件名,默认值: appsettings.json
- public static TOptions Get( string section,string configFileName = "appsettings.json" ) {
- var configuration = GetConfiguration( configFileName );
- return Get( configuration, section );
+ public static TOptions Get( string section ) {
+ return GetSection( section ).Get();
+ }
+
+ ///
+ /// 获取配置节
+ ///
+ /// 配置节
+ public static IConfigurationSection GetSection( string section ) {
+ return GetConfiguration().GetSection( section );
}
///
/// 获取配置
///
- private static IConfiguration GetConfiguration( string configFileName ) {
- if ( _configuration != null )
- return _configuration;
- return CreateConfiguration( configFileName );
+ private static IConfiguration GetConfiguration() {
+ return _configuration ??= CreateConfiguration();
}
///
/// 创建配置
///
- private static IConfiguration CreateConfiguration( string configFileName ) {
- var builder = new ConfigurationBuilder();
- builder.SetBasePath( Platform.ApplicationBaseDirectory ).AddJsonFile( configFileName );
+ private static IConfiguration CreateConfiguration() {
+ var builder = new ConfigurationBuilder()
+ .SetBasePath( Platform.ApplicationBaseDirectory )
+ .AddJsonFile( "appsettings.json", true, true );
+ var environment = Environment.GetEnvironmentName();
+ if ( environment.IsEmpty() == false )
+ builder.AddJsonFile( $"appsettings.{environment}.json", true, true );
return builder.Build();
}
- ///
- /// 获取配置选项
- ///
- private static TOptions Get( IConfiguration configuration, string section ) {
- return configuration.GetSection( section ).Get();
- }
-
///
/// 获取数据库连接字符串
///
/// 数据库连接字符串键名
public static string GetConnectionString( string name ) {
- var configuration = GetConfiguration( "appsettings.json" );
- return configuration.GetConnectionString( name );
+ return GetConfiguration().GetConnectionString( name );
}
}
}
diff --git a/src/Util.Core/Helpers/Convert.cs b/src/Util.Core/Helpers/Convert.cs
index 52dbe3ec..8f9618d7 100644
--- a/src/Util.Core/Helpers/Convert.cs
+++ b/src/Util.Core/Helpers/Convert.cs
@@ -194,7 +194,14 @@ namespace Util.Helpers {
///
/// 输入值
public static bool? ToBoolOrNull( object input ) {
- return bool.TryParse( input.SafeString(), out var result ) ? result : null;
+ var value = input.SafeString();
+ switch ( value ) {
+ case "1":
+ return true;
+ case "0":
+ return false;
+ }
+ return bool.TryParse( value, out var result ) ? result : null;
}
#endregion
@@ -218,7 +225,10 @@ namespace Util.Helpers {
///
/// 输入值
public static DateTime? ToDateTimeOrNull( object input ) {
- return DateTime.TryParse( input.SafeString(), out var result ) ? result : null;
+ var success = DateTime.TryParse( input.SafeString(), out var result );
+ if ( success == false )
+ return null;
+ return Time.Normalize( result );
}
#endregion
@@ -311,17 +321,15 @@ namespace Util.Helpers {
if( input is string && string.IsNullOrWhiteSpace( input.ToString() ) )
return default;
Type type = Common.GetType();
- var typeName = type.Name.ToLower();
+ var typeName = type.Name.ToUpperInvariant();
try {
- if( typeName == "string" )
- return (T)(object)input.ToString();
- if( typeName == "guid" )
- return (T)(object)new Guid( input.ToString() );
- if( type.IsEnum )
+ if( typeName == "STRING" || typeName == "GUID" )
+ return (T)TypeDescriptor.GetConverter( typeof( T ) ).ConvertFromInvariantString( input.ToString() );
+ if ( type.IsEnum )
return Enum.Parse( input );
- if( input is IConvertible )
+ if ( input is IConvertible )
return (T)System.Convert.ChangeType( input, type, CultureInfo.InvariantCulture );
- if( input is JsonElement element ) {
+ if ( input is JsonElement element ) {
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
return Json.ToObject( element.GetRawText(), options );
}
diff --git a/src/Util.Core/Helpers/Culture.cs b/src/Util.Core/Helpers/Culture.cs
new file mode 100644
index 00000000..24da7333
--- /dev/null
+++ b/src/Util.Core/Helpers/Culture.cs
@@ -0,0 +1,38 @@
+using System.Collections.Generic;
+using System.Globalization;
+
+namespace Util.Helpers {
+ ///
+ /// 区域文化
+ ///
+ public static class Culture {
+ ///
+ /// 获取当前区域文化信息列表,包含所有父区域文化
+ ///
+ public static List GetCurrentCultures() {
+ return GetCultures( CultureInfo.CurrentCulture );
+ }
+
+ ///
+ /// 获取当前UI区域文化信息列表,包含所有父区域文化
+ ///
+ public static List GetCurrentUICultures() {
+ return GetCultures( CultureInfo.CurrentUICulture );
+ }
+
+ ///
+ /// 获取区域文化信息列表,包含所有父区域文化
+ ///
+ /// 区域文化信息
+ public static List GetCultures( CultureInfo culture ) {
+ var result = new List();
+ if ( culture == null )
+ return result;
+ while ( culture.Equals( culture.Parent ) == false ) {
+ result.Add( culture );
+ culture = culture.Parent;
+ }
+ return result;
+ }
+ }
+}
diff --git a/src/Util.Core/Helpers/Enum.cs b/src/Util.Core/Helpers/Enum.cs
index ca3004b7..0c728bb7 100644
--- a/src/Util.Core/Helpers/Enum.cs
+++ b/src/Util.Core/Helpers/Enum.cs
@@ -104,7 +104,7 @@ namespace Util.Helpers {
public static List- GetItems( Type type ) {
type = Common.GetType( type );
if( type.IsEnum == false )
- throw new InvalidOperationException( string.Format( UtilCoreResource.TypeNotEnum,type ) );
+ throw new InvalidOperationException( string.Format( R.TypeNotEnum,type ) );
var result = new List
- ();
foreach( var field in type.GetFields() )
AddItem( type, result, field );
@@ -137,7 +137,7 @@ namespace Util.Helpers {
public static List GetNames( Type type ) {
type = Common.GetType( type );
if( type.IsEnum == false )
- throw new InvalidOperationException( string.Format( UtilCoreResource.TypeNotEnum, type ) );
+ throw new InvalidOperationException( string.Format( R.TypeNotEnum, type ) );
var result = new List();
foreach ( var field in type.GetFields() ) {
if( !field.FieldType.IsEnum )
diff --git a/src/Util.Core/Helpers/Environment.cs b/src/Util.Core/Helpers/Environment.cs
new file mode 100644
index 00000000..881a42e2
--- /dev/null
+++ b/src/Util.Core/Helpers/Environment.cs
@@ -0,0 +1,60 @@
+namespace Util.Helpers {
+ ///
+ /// 环境操作
+ ///
+ public static class Environment {
+ ///
+ /// DOTNET_ENVIRONMENT
+ ///
+ private const string DOTNET_ENVIRONMENT = "DOTNET_ENVIRONMENT";
+ ///
+ /// ASPNETCORE_ENVIRONMENT
+ ///
+ private const string ASPNETCORE_ENVIRONMENT = "ASPNETCORE_ENVIRONMENT";
+ ///
+ /// Development
+ ///
+ private const string Development = "Development";
+
+ ///
+ /// 设置环境变量
+ ///
+ /// 环境变量名
+ /// 值
+ public static void SetEnvironmentVariable( string name, string value ) {
+ System.Environment.SetEnvironmentVariable( name, value );
+ }
+
+ ///
+ /// 获取环境变量
+ ///
+ /// 环境变量名
+ public static string GetEnvironmentVariable( string name ) {
+ return System.Environment.GetEnvironmentVariable( name );
+ }
+
+ ///
+ /// 获取环境名称
+ ///
+ public static string GetEnvironmentName() {
+ var environment = GetEnvironmentVariable( ASPNETCORE_ENVIRONMENT );
+ if ( environment.IsEmpty() == false )
+ return environment;
+ return GetEnvironmentVariable( DOTNET_ENVIRONMENT );
+ }
+
+ ///
+ /// 设置开发环境变量,如果环境变量已设置则忽略
+ ///
+ public static void SetDevelopment() {
+ var environment = GetEnvironmentVariable( DOTNET_ENVIRONMENT );
+ if ( environment.IsEmpty() == false )
+ return;
+ environment = GetEnvironmentVariable( ASPNETCORE_ENVIRONMENT );
+ if ( environment.IsEmpty() == false )
+ return;
+ SetEnvironmentVariable( DOTNET_ENVIRONMENT, Development );
+ SetEnvironmentVariable( ASPNETCORE_ENVIRONMENT, Development );
+ }
+ }
+}
diff --git a/src/Util.Core/Helpers/Id.cs b/src/Util.Core/Helpers/Id.cs
index 5ae89183..5ac41888 100644
--- a/src/Util.Core/Helpers/Id.cs
+++ b/src/Util.Core/Helpers/Id.cs
@@ -1,4 +1,5 @@
using System;
+using System.Threading;
namespace Util.Helpers {
///
@@ -8,35 +9,35 @@ namespace Util.Helpers {
///
/// 标识
///
- private static string _id;
+ private static readonly AsyncLocal _id = new();
///
/// 设置标识
///
- /// Id
+ /// 标识
public static void SetId( string id ) {
- _id = id;
+ _id.Value = id;
}
///
/// 重置标识
///
public static void Reset() {
- _id = null;
+ _id.Value = null;
}
///
/// 使用去掉分隔符的Guid创建标识
///
public static string Create() {
- return string.IsNullOrWhiteSpace( _id ) ? System.Guid.NewGuid().ToString( "N" ) : _id;
+ return string.IsNullOrEmpty( _id.Value ) ? System.Guid.NewGuid().ToString( "N" ) : _id.Value;
}
///
/// 创建Guid标识
///
public static Guid CreateGuid() {
- return string.IsNullOrWhiteSpace( _id ) ? System.Guid.NewGuid() : _id.ToGuid();
+ return string.IsNullOrEmpty( _id.Value ) ? System.Guid.NewGuid() : _id.Value.ToGuid();
}
}
}
diff --git a/src/Util.Core/Helpers/Json.cs b/src/Util.Core/Helpers/Json.cs
index 7bcf61f4..08649fab 100644
--- a/src/Util.Core/Helpers/Json.cs
+++ b/src/Util.Core/Helpers/Json.cs
@@ -1,8 +1,12 @@
using System.IO;
using System.Text;
+using System.Text.Encodings.Web;
using System.Text.Json;
+using System.Text.Json.Serialization;
+using System.Text.Unicode;
using System.Threading;
using System.Threading.Tasks;
+using Util.SystemTextJson;
namespace Util.Helpers {
///
@@ -18,12 +22,28 @@ namespace Util.Helpers {
public static string ToJson( T value, JsonSerializerOptions options = null,bool removeQuotationMarks = false ) {
if ( value == null )
return string.Empty;
+ options = GetToJsonOptions( options );
var result = JsonSerializer.Serialize( value, options );
if ( removeQuotationMarks )
result = result.Replace( "\"","" );
return result;
}
+ ///
+ /// 获取对象转换为Json字符串的序列化配置
+ ///
+ private static JsonSerializerOptions GetToJsonOptions( JsonSerializerOptions options ) {
+ if ( options != null )
+ return options;
+ return new JsonSerializerOptions {
+ Encoder = JavaScriptEncoder.Create( UnicodeRanges.All ),
+ Converters = {
+ new DateTimeJsonConverter(),
+ new NullableDateTimeJsonConverter()
+ }
+ };
+ }
+
///
/// 将对象转换为Json字符串
///
@@ -33,6 +53,7 @@ namespace Util.Helpers {
public static async Task ToJsonAsyc( T value, JsonSerializerOptions options = null, CancellationToken cancellationToken = default ) {
if ( value == null )
return string.Empty;
+ options = GetToJsonOptions( options );
await using var stream = new MemoryStream();
await JsonSerializer.SerializeAsync( stream, value, typeof( T ), options, cancellationToken );
stream.Position = 0;
@@ -48,9 +69,27 @@ namespace Util.Helpers {
public static T ToObject( string json, JsonSerializerOptions options = null ) {
if ( string.IsNullOrWhiteSpace( json ) )
return default;
+ options = GetToObjectOptions( options );
return JsonSerializer.Deserialize( json, options );
}
+ ///
+ /// 获取Json字符串转换为对象的序列化配置
+ ///
+ private static JsonSerializerOptions GetToObjectOptions( JsonSerializerOptions options ) {
+ if ( options != null )
+ return options;
+ return new JsonSerializerOptions {
+ PropertyNameCaseInsensitive = true,
+ NumberHandling = JsonNumberHandling.AllowReadingFromString,
+ Encoder = JavaScriptEncoder.Create( UnicodeRanges.All ),
+ Converters = {
+ new DateTimeJsonConverter(),
+ new NullableDateTimeJsonConverter()
+ }
+ };
+ }
+
///
/// 将Json字符串转换为对象
///
@@ -76,6 +115,7 @@ namespace Util.Helpers {
public static async Task ToObjectAsync( Stream json, JsonSerializerOptions options = null, CancellationToken cancellationToken = default ) {
if ( json == null )
return default;
+ options = GetToObjectOptions( options );
return await JsonSerializer.DeserializeAsync( json, options, cancellationToken );
}
}
diff --git a/src/Util.Core/Helpers/Platform.cs b/src/Util.Core/Helpers/Platform.cs
index adec4b13..f188b402 100644
--- a/src/Util.Core/Helpers/Platform.cs
+++ b/src/Util.Core/Helpers/Platform.cs
@@ -15,14 +15,16 @@ namespace Util.Helpers {
/// 获取物理路径
///
/// 相对路径,范例:"test/a.txt" 或 "/test/a.txt"
- public static string GetPhysicalPath( string relativePath ) {
+ /// 基路径,默认为AppContext.BaseDirectory
+ public static string GetPhysicalPath( string relativePath,string basePath = null ) {
if( relativePath.StartsWith( "~" ) )
relativePath = relativePath.TrimStart( '~' );
if( relativePath.StartsWith( "/" ) )
relativePath = relativePath.TrimStart( '/' );
if( relativePath.StartsWith( "\\" ) )
relativePath = relativePath.TrimStart( '\\' );
- return Path.Combine( ApplicationBaseDirectory, relativePath );
+ basePath ??= ApplicationBaseDirectory;
+ return Path.Combine( basePath, relativePath );
}
}
}
diff --git a/src/Util.Core/Helpers/Time.cs b/src/Util.Core/Helpers/Time.cs
index 0ad38f6a..e5c46f63 100644
--- a/src/Util.Core/Helpers/Time.cs
+++ b/src/Util.Core/Helpers/Time.cs
@@ -1,5 +1,6 @@
using System;
using System.Threading;
+using Util.Dates;
namespace Util.Helpers {
///
@@ -9,7 +10,15 @@ namespace Util.Helpers {
///
/// 日期
///
- private static AsyncLocal _dateTime = new AsyncLocal();
+ private static readonly AsyncLocal _dateTime = new();
+ ///
+ /// 是否使用Utc日期
+ ///
+ private static readonly AsyncLocal _isUseUtc = new();
+ ///
+ /// 是否使用Utc日期
+ ///
+ private static bool IsUseUtc => _isUseUtc.Value != null ? _isUseUtc.Value.SafeValue() : TimeOptions.IsUseUtc;
///
/// 设置时间
@@ -24,30 +33,61 @@ namespace Util.Helpers {
///
/// 时间
public static void SetTime( string dateTime ) {
- SetTime( Util.Helpers.Convert.ToDateTimeOrNull( dateTime ) );
+ SetTime( Convert.ToDateTimeOrNull( dateTime ) );
}
///
- /// 重置时间
+ /// 设置使用Utc日期
+ ///
+ /// 是否使用Utc日期,默认值: true
+ public static void UseUtc( bool? isUseUtc = true ) {
+ _isUseUtc.Value = isUseUtc;
+ }
+
+ ///
+ /// 重置时间和Utc标志
///
public static void Reset() {
_dateTime.Value = null;
+ _isUseUtc.Value = null;
}
///
/// 获取当前日期时间
///
- public static DateTime GetDateTime() {
- if ( _dateTime.Value == null )
- return DateTime.Now;
- return _dateTime.Value.Value;
+ public static DateTime Now {
+ get {
+ if ( _dateTime.Value != null )
+ return _dateTime.Value.Value;
+ return IsUseUtc ? DateTime.UtcNow : DateTime.Now;
+ }
}
///
- /// 获取当前日期,不带时间
+ /// 转换为标准化日期
///
- public static DateTime GetDate() {
- return GetDateTime().Date;
+ /// 日期
+ public static DateTime Normalize( DateTime date ) {
+ if( date == DateTime.MinValue )
+ return DateTime.MinValue;
+ if ( IsUseUtc ) {
+ switch ( date.Kind ) {
+ case DateTimeKind.Local:
+ return date.ToUniversalTime();
+ case DateTimeKind.Unspecified:
+ return DateTime.SpecifyKind( date, DateTimeKind.Utc );
+ default:
+ return date;
+ }
+ }
+ switch ( date.Kind ) {
+ case DateTimeKind.Utc:
+ return date.ToLocalTime();
+ case DateTimeKind.Unspecified:
+ return DateTime.SpecifyKind( date, DateTimeKind.Local );
+ default:
+ return date;
+ }
}
///
diff --git a/src/Util.Core/HostBuilderExtensions.cs b/src/Util.Core/HostBuilderExtensions.cs
new file mode 100644
index 00000000..e6ac78eb
--- /dev/null
+++ b/src/Util.Core/HostBuilderExtensions.cs
@@ -0,0 +1,59 @@
+using System;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Util.Configs;
+using Util.Infrastructure;
+
+namespace Util {
+ ///
+ /// 主机生成器服务扩展
+ ///
+ public static class HostBuilderExtensions {
+ ///
+ /// 注册Util前置服务,用于配置具有延迟的服务
+ ///
+ /// 主机生成器
+ /// 服务配置操作
+ public static IHostBuilder AddUtilBefore( this IHostBuilder hostBuilder, Action setupAction = null ) {
+ hostBuilder.CheckNull( nameof( hostBuilder ) );
+ hostBuilder.ConfigureServices( ( context, services ) => {
+ Util.Helpers.Config.SetConfiguration( context.Configuration );
+ } );
+ hostBuilder.AddOptions( setupAction );
+ return hostBuilder;
+ }
+
+ ///
+ /// 注册Util服务
+ ///
+ /// 主机生成器
+ /// 服务配置操作
+ public static IHostBuilder AddUtil( this IHostBuilder hostBuilder, Action setupAction = null ) {
+ hostBuilder.CheckNull( nameof( hostBuilder ) );
+ var bootstrapper = new Bootstrapper( hostBuilder, setupAction );
+ bootstrapper.Start();
+ return hostBuilder;
+ }
+
+ ///
+ /// 注册Util配置操作
+ ///
+ /// 主机生成器
+ /// 服务配置操作
+ public static IHostBuilder AddOptions( this IHostBuilder hostBuilder, Action setupAction = null ) where TOptions : class, IOptions, new() {
+ hostBuilder.CheckNull( nameof( hostBuilder ) );
+ var options = new TOptions();
+ setupAction?.Invoke( options );
+ hostBuilder.ConfigureServices( ( context, services ) => {
+ if ( setupAction != null )
+ services.Configure( setupAction );
+ } );
+ foreach ( var extension in options.Extensions ) {
+ extension.Config( hostBuilder );
+ hostBuilder.ConfigureAppConfiguration( extension.ConfigureAppConfiguration );
+ hostBuilder.ConfigureServices( extension.ConfigureServices );
+ }
+ return hostBuilder;
+ }
+ }
+}
diff --git a/src/Util.Core/Infrastructure/Bootstrapper.cs b/src/Util.Core/Infrastructure/Bootstrapper.cs
index 81cf27ef..3e9fa843 100644
--- a/src/Util.Core/Infrastructure/Bootstrapper.cs
+++ b/src/Util.Core/Infrastructure/Bootstrapper.cs
@@ -1,8 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using Microsoft.Extensions.Configuration;
-using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
using Util.Configs;
using Util.Dependency;
using Util.Helpers;
@@ -14,18 +13,14 @@ namespace Util.Infrastructure {
///
public class Bootstrapper {
///
- /// 服务集合
+ /// 主机生成器
///
- private readonly IServiceCollection _services;
+ private readonly IHostBuilder _hostBuilder;
///
/// 服务配置
///
private readonly Action _setupAction;
///
- /// 配置
- ///
- private readonly IConfiguration _configuration;
- ///
/// 类型查找器
///
private readonly ITypeFinder _finder;
@@ -37,13 +32,11 @@ namespace Util.Infrastructure {
///
/// 初始化启动器
///
- /// 服务集合
+ /// 主机生成器
/// 服务配置操作
- /// 配置
- public Bootstrapper( IServiceCollection services, Action setupAction = null, IConfiguration configuration = null ) {
- _services = services ?? throw new ArgumentNullException( nameof( services ) );
+ public Bootstrapper( IHostBuilder hostBuilder, Action setupAction = null ) {
+ _hostBuilder = hostBuilder ?? throw new ArgumentNullException( nameof( hostBuilder ) );
_setupAction = setupAction;
- _configuration = configuration;
var assemblyFinder = new AppDomainAssemblyFinder { AssemblySkipPattern = BootstrapperConfig.AssemblySkipPattern };
_finder = new AppDomainTypeFinder( assemblyFinder );
_serviceActions = new List();
@@ -52,42 +45,54 @@ namespace Util.Infrastructure {
///
/// 启动
///
- public void Start() {
+ public virtual void Start() {
+ SetConfiguration();
ResolveServiceRegistrar();
ConfigOptions();
ResolveDependencyRegistrar();
ExecuteServiceActions();
}
+ ///
+ /// 设置配置实例
+ ///
+ protected virtual void SetConfiguration() {
+ _hostBuilder.ConfigureServices( ( context, services ) => {
+ Util.Helpers.Config.SetConfiguration( context.Configuration );
+ } );
+ }
+
///
/// 解析服务注册器
///
- private void ResolveServiceRegistrar() {
+ protected virtual void ResolveServiceRegistrar() {
var types = _finder.Find();
var instances = types.Select( type => Reflection.CreateInstance( type ) ).Where( t => t.Enabled ).OrderBy( t => t.Id ).ToList();
- instances.ForEach( t => _serviceActions.Add( t.Register( _services, _configuration, _finder ) ) );
+ instances.ForEach( t => _serviceActions.Add( t.Register( _hostBuilder, _finder ) ) );
}
///
/// 注册配置项
///
- private void ConfigOptions() {
- _services.AddOptions( _setupAction );
+ protected virtual void ConfigOptions() {
+ _hostBuilder.AddOptions( _setupAction );
}
///
/// 解析依赖注册器
///
- private void ResolveDependencyRegistrar() {
+ protected virtual void ResolveDependencyRegistrar() {
var types = _finder.Find();
var instances = types.Select( type => Reflection.CreateInstance( type ) ).OrderBy( t => t.Order ).ToList();
- instances.ForEach( t => t.Register( _services ) );
+ _hostBuilder.ConfigureServices( ( context, services ) => {
+ instances.ForEach( t => t.Register( services ) );
+ } );
}
///
/// 执行延迟服务注册操作
///
- private void ExecuteServiceActions() {
+ protected virtual void ExecuteServiceActions() {
_serviceActions.ForEach( action => action?.Invoke() );
}
}
diff --git a/src/Util.Core/Infrastructure/DependencyServiceRegistrar.cs b/src/Util.Core/Infrastructure/DependencyServiceRegistrar.cs
index e3b209d5..365bacab 100644
--- a/src/Util.Core/Infrastructure/DependencyServiceRegistrar.cs
+++ b/src/Util.Core/Infrastructure/DependencyServiceRegistrar.cs
@@ -1,8 +1,8 @@
using System;
using System.Collections.Generic;
-using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
+using Microsoft.Extensions.Hosting;
using Util.Dependency;
using Util.Reflections;
@@ -29,14 +29,15 @@ namespace Util.Infrastructure {
///
/// 注册服务
///
- /// 服务集合
- /// 配置
+ /// 主机生成器
/// 类型查找器
- public Action Register( IServiceCollection services, IConfiguration configuration, ITypeFinder finder ) {
+ public Action Register( IHostBuilder hostBuilder, ITypeFinder finder ) {
return () => {
- RegisterDependency( services, finder, ServiceLifetime.Singleton );
- RegisterDependency( services, finder, ServiceLifetime.Scoped );
- RegisterDependency( services, finder, ServiceLifetime.Transient );
+ hostBuilder.ConfigureServices( ( context, services ) => {
+ RegisterDependency( services, finder, ServiceLifetime.Singleton );
+ RegisterDependency( services, finder, ServiceLifetime.Scoped );
+ RegisterDependency( services, finder, ServiceLifetime.Transient );
+ } );
};
}
diff --git a/src/Util.Core/Infrastructure/IServiceRegistrar.cs b/src/Util.Core/Infrastructure/IServiceRegistrar.cs
index 75611bea..13dd3623 100644
--- a/src/Util.Core/Infrastructure/IServiceRegistrar.cs
+++ b/src/Util.Core/Infrastructure/IServiceRegistrar.cs
@@ -1,6 +1,5 @@
using System;
-using Microsoft.Extensions.Configuration;
-using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
using Util.Reflections;
namespace Util.Infrastructure {
@@ -11,17 +10,22 @@ namespace Util.Infrastructure {
///
/// 标识
///
- int Id { get; }
+ int Id {
+ get;
+ }
+
///
/// 是否启用
///
- bool Enabled { get; }
+ bool Enabled {
+ get;
+ }
+
///
/// 注册服务,该操作在启动开始时执行,如果需要延迟执行某些操作,可在返回的Action中执行,它将在启动最后执行
///
- /// 服务集合
- /// 配置
+ /// 主机生成器
/// 类型查找器
- Action Register( IServiceCollection services, IConfiguration configuration, ITypeFinder finder );
+ Action Register( IHostBuilder hostBuilder, ITypeFinder finder );
}
}
diff --git a/src/Util.Core/Properties/R.Designer.cs b/src/Util.Core/Properties/R.Designer.cs
index 9d505d02..0c83b21b 100644
--- a/src/Util.Core/Properties/R.Designer.cs
+++ b/src/Util.Core/Properties/R.Designer.cs
@@ -19,7 +19,7 @@ namespace Util.Properties {
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
public class R {
@@ -60,6 +60,33 @@ namespace Util.Properties {
}
}
+ ///
+ /// 查找类似 仅允许添加一个条件,条件:{0} 的本地化字符串。
+ ///
+ public static string CanOnlyOneCondition {
+ get {
+ return ResourceManager.GetString("CanOnlyOneCondition", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 当前操作的数据已被其他人修改,请刷新后重试 的本地化字符串。
+ ///
+ public static string ConcurrencyExceptionMessage {
+ get {
+ return ResourceManager.GetString("ConcurrencyExceptionMessage", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 天 的本地化字符串。
+ ///
+ public static string Days {
+ get {
+ return ResourceManager.GetString("Days", resourceCulture);
+ }
+ }
+
///
/// 查找类似 删除成功 的本地化字符串。
///
@@ -69,6 +96,33 @@ namespace Util.Properties {
}
}
+ ///
+ /// 查找类似 其他用户正在执行该操作,请稍后再试 的本地化字符串。
+ ///
+ public static string GlobalDuplicateRequest {
+ get {
+ return ResourceManager.GetString("GlobalDuplicateRequest", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 小时 的本地化字符串。
+ ///
+ public static string Hours {
+ get {
+ return ResourceManager.GetString("Hours", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 标识不能为空 的本地化字符串。
+ ///
+ public static string IdIsEmpty {
+ get {
+ return ResourceManager.GetString("IdIsEmpty", resourceCulture);
+ }
+ }
+
///
/// 查找类似 序号 的本地化字符串。
///
@@ -78,6 +132,24 @@ namespace Util.Properties {
}
}
+ ///
+ /// 查找类似 毫秒 的本地化字符串。
+ ///
+ public static string Milliseconds {
+ get {
+ return ResourceManager.GetString("Milliseconds", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 分 的本地化字符串。
+ ///
+ public static string Minutes {
+ get {
+ return ResourceManager.GetString("Minutes", resourceCulture);
+ }
+ }
+
///
/// 查找类似 否 的本地化字符串。
///
@@ -87,6 +159,15 @@ namespace Util.Properties {
}
}
+ ///
+ /// 查找类似 秒 的本地化字符串。
+ ///
+ public static string Seconds {
+ get {
+ return ResourceManager.GetString("Seconds", resourceCulture);
+ }
+ }
+
///
/// 查找类似 操作成功 的本地化字符串。
///
@@ -105,6 +186,15 @@ namespace Util.Properties {
}
}
+ ///
+ /// 查找类似 类型 {0} 不是枚举 的本地化字符串。
+ ///
+ public static string TypeNotEnum {
+ get {
+ return ResourceManager.GetString("TypeNotEnum", resourceCulture);
+ }
+ }
+
///
/// 查找类似 上传 的本地化字符串。
///
@@ -114,6 +204,15 @@ namespace Util.Properties {
}
}
+ ///
+ /// 查找类似 请不要重复提交 的本地化字符串。
+ ///
+ public static string UserDuplicateRequest {
+ get {
+ return ResourceManager.GetString("UserDuplicateRequest", resourceCulture);
+ }
+ }
+
///
/// 查找类似 是 的本地化字符串。
///
diff --git a/src/Util.Core/Properties/R.resx b/src/Util.Core/Properties/R.resx
index cadf544a..95e2a065 100644
--- a/src/Util.Core/Properties/R.resx
+++ b/src/Util.Core/Properties/R.resx
@@ -117,15 +117,42 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ 仅允许添加一个条件,条件:{0}
+
+
+ 当前操作的数据已被其他人修改,请刷新后重试
+
+
+ 天
+
删除成功
+
+ 其他用户正在执行该操作,请稍后再试
+
+
+ 小时
+
+
+ 标识不能为空
+
序号
+
+ 毫秒
+
+
+ 分
+
否
+
+ 秒
+
操作成功
@@ -133,9 +160,15 @@
系统忙,请稍后再试
抛出系统异常时显示该消息
+
+ 类型 {0} 不是枚举
+
上传
+
+ 请不要重复提交
+
是
diff --git a/src/Util.Core/Properties/UtilCoreResource.Designer.cs b/src/Util.Core/Properties/UtilCoreResource.Designer.cs
deleted file mode 100644
index 57aa9930..00000000
--- a/src/Util.Core/Properties/UtilCoreResource.Designer.cs
+++ /dev/null
@@ -1,162 +0,0 @@
-//------------------------------------------------------------------------------
-//
-// 此代码由工具生成。
-// 运行时版本:4.0.30319.42000
-//
-// 对此文件的更改可能会导致不正确的行为,并且如果
-// 重新生成代码,这些更改将会丢失。
-//
-//------------------------------------------------------------------------------
-
-namespace Util.Properties {
- using System;
-
-
- ///
- /// 一个强类型的资源类,用于查找本地化的字符串等。
- ///
- // 此类是由 StronglyTypedResourceBuilder
- // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
- // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
- // (以 /str 作为命令选项),或重新生成 VS 项目。
- [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
- [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
- public class UtilCoreResource {
-
- private static global::System.Resources.ResourceManager resourceMan;
-
- private static global::System.Globalization.CultureInfo resourceCulture;
-
- [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
- internal UtilCoreResource() {
- }
-
- ///
- /// 返回此类使用的缓存的 ResourceManager 实例。
- ///
- [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
- public static global::System.Resources.ResourceManager ResourceManager {
- get {
- if (object.ReferenceEquals(resourceMan, null)) {
- global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Util.Properties.UtilCoreResource", typeof(UtilCoreResource).Assembly);
- resourceMan = temp;
- }
- return resourceMan;
- }
- }
-
- ///
- /// 重写当前线程的 CurrentUICulture 属性,对
- /// 使用此强类型资源类的所有资源查找执行重写。
- ///
- [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
- public static global::System.Globalization.CultureInfo Culture {
- get {
- return resourceCulture;
- }
- set {
- resourceCulture = value;
- }
- }
-
- ///
- /// 查找类似 仅允许添加一个条件,条件:{0} 的本地化字符串。
- ///
- public static string CanOnlyOneCondition {
- get {
- return ResourceManager.GetString("CanOnlyOneCondition", resourceCulture);
- }
- }
-
- ///
- /// 查找类似 当前操作的数据已被其他人修改,请刷新后重试 的本地化字符串。
- ///
- public static string ConcurrencyExceptionMessage {
- get {
- return ResourceManager.GetString("ConcurrencyExceptionMessage", resourceCulture);
- }
- }
-
- ///
- /// 查找类似 天 的本地化字符串。
- ///
- public static string Days {
- get {
- return ResourceManager.GetString("Days", resourceCulture);
- }
- }
-
- ///
- /// 查找类似 其他用户正在执行该操作,请稍后再试 的本地化字符串。
- ///
- public static string GlobalDuplicateRequest {
- get {
- return ResourceManager.GetString("GlobalDuplicateRequest", resourceCulture);
- }
- }
-
- ///
- /// 查找类似 小时 的本地化字符串。
- ///
- public static string Hours {
- get {
- return ResourceManager.GetString("Hours", resourceCulture);
- }
- }
-
- ///
- /// 查找类似 标识不能为空 的本地化字符串。
- ///
- public static string IdIsEmpty {
- get {
- return ResourceManager.GetString("IdIsEmpty", resourceCulture);
- }
- }
-
- ///
- /// 查找类似 毫秒 的本地化字符串。
- ///
- public static string Milliseconds {
- get {
- return ResourceManager.GetString("Milliseconds", resourceCulture);
- }
- }
-
- ///
- /// 查找类似 分 的本地化字符串。
- ///
- public static string Minutes {
- get {
- return ResourceManager.GetString("Minutes", resourceCulture);
- }
- }
-
- ///
- /// 查找类似 秒 的本地化字符串。
- ///
- public static string Seconds {
- get {
- return ResourceManager.GetString("Seconds", resourceCulture);
- }
- }
-
- ///
- /// 查找类似 类型 {0} 不是枚举 的本地化字符串。
- ///
- public static string TypeNotEnum {
- get {
- return ResourceManager.GetString("TypeNotEnum", resourceCulture);
- }
- }
-
- ///
- /// 查找类似 请不要重复提交 的本地化字符串。
- ///
- public static string UserDuplicateRequest {
- get {
- return ResourceManager.GetString("UserDuplicateRequest", resourceCulture);
- }
- }
- }
-}
diff --git a/src/Util.Core/Security/IEncryptor.cs b/src/Util.Core/Security/IEncryptor.cs
new file mode 100644
index 00000000..0d014897
--- /dev/null
+++ b/src/Util.Core/Security/IEncryptor.cs
@@ -0,0 +1,17 @@
+namespace Util.Security {
+ ///
+ /// 加密器
+ ///
+ public interface IEncryptor {
+ ///
+ /// 加密
+ ///
+ /// 原始数据
+ string Encrypt( string data );
+ ///
+ /// 解密
+ ///
+ /// 已加密数据
+ string Decrypt( string data );
+ }
+}
\ No newline at end of file
diff --git a/src/Util.Core/Security/NullEncryptor.cs b/src/Util.Core/Security/NullEncryptor.cs
new file mode 100644
index 00000000..f599fe07
--- /dev/null
+++ b/src/Util.Core/Security/NullEncryptor.cs
@@ -0,0 +1,27 @@
+namespace Util.Security {
+ ///
+ /// 空加密器
+ ///
+ public class NullEncryptor : IEncryptor {
+ ///
+ /// 空加密器实例
+ ///
+ public static readonly IEncryptor Instance = new NullEncryptor();
+
+ ///
+ /// 加密
+ ///
+ /// 原始数据
+ public string Encrypt( string data ) {
+ return string.Empty;
+ }
+
+ ///
+ /// 解密
+ ///
+ /// 已加密数据
+ public string Decrypt( string data ) {
+ return string.Empty;
+ }
+ }
+}
diff --git a/src/Util.Core/ServiceCollectionExtensions.cs b/src/Util.Core/ServiceCollectionExtensions.cs
index d0942702..d895176f 100644
--- a/src/Util.Core/ServiceCollectionExtensions.cs
+++ b/src/Util.Core/ServiceCollectionExtensions.cs
@@ -1,9 +1,6 @@
-using System;
-using System.Linq;
+using System.Linq;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
-using Util.Configs;
-using Util.Infrastructure;
namespace Util {
///
@@ -32,35 +29,5 @@ namespace Util {
return (T)descriptor.ImplementationFactory.Invoke( null );
return default;
}
-
- ///
- /// 添加配置
- ///
- /// 服务集合
- /// 服务配置操作
- public static IServiceCollection AddOptions( this IServiceCollection services, Action setupAction ) where TOptions : class, new() {
- var options = new TOptions();
- setupAction?.Invoke( options );
- if( options is IOptions conig ) {
- foreach( var extension in conig.Extensions )
- extension.AddServices( services );
- }
- if( setupAction != null )
- services.Configure( setupAction );
- return services;
- }
-
- ///
- /// 注册Util服务
- ///
- /// 服务集合
- /// 服务配置操作
- public static IServiceCollection AddUtil( this IServiceCollection services, Action setupAction = null ) {
- var configuration = services.GetConfiguration();
- Util.Helpers.Config.SetConfiguration( configuration );
- var bootstrapper = new Bootstrapper( services, setupAction, configuration );
- bootstrapper.Start();
- return services;
- }
}
}
diff --git a/src/Util.Core/SystemTextJson/DateTimeJsonConverter.cs b/src/Util.Core/SystemTextJson/DateTimeJsonConverter.cs
new file mode 100644
index 00000000..1e46d238
--- /dev/null
+++ b/src/Util.Core/SystemTextJson/DateTimeJsonConverter.cs
@@ -0,0 +1,52 @@
+using System;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+using Util.Helpers;
+using Convert = Util.Helpers.Convert;
+
+namespace Util.SystemTextJson {
+ ///
+ /// 日期格式Json转换器
+ ///
+ public class DateTimeJsonConverter : JsonConverter {
+ ///
+ /// 日期格式
+ ///
+ private readonly string _format;
+
+ ///
+ /// 初始化日期格式Json转换器
+ ///
+ public DateTimeJsonConverter() : this( "yyyy-MM-dd HH:mm:ss" ) {
+ }
+
+ ///
+ /// 初始化日期格式Json转换器
+ ///
+ /// 日期格式,默认值: yyyy-MM-dd HH:mm:ss
+ public DateTimeJsonConverter( string format ) {
+ _format = format;
+ }
+
+ ///
+ /// 读取数据
+ ///
+ public override DateTime Read( ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options ) {
+ if ( reader.TokenType == JsonTokenType.String ) {
+ return Time.Normalize( Convert.ToDateTime( reader.GetString() ) );
+ }
+ if ( reader.TryGetDateTime( out var date ) ) {
+ return Time.Normalize( date );
+ }
+ return DateTime.MinValue;
+ }
+
+ ///
+ /// 写入数据
+ ///
+ public override void Write( Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options ) {
+ var date = Time.Normalize( value ).ToString( _format );
+ writer.WriteStringValue( date );
+ }
+ }
+}
diff --git a/src/Util.Core/SystemTextJson/NullableDateTimeJsonConverter.cs b/src/Util.Core/SystemTextJson/NullableDateTimeJsonConverter.cs
new file mode 100644
index 00000000..366a283a
--- /dev/null
+++ b/src/Util.Core/SystemTextJson/NullableDateTimeJsonConverter.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+using Util.Helpers;
+using Convert = Util.Helpers.Convert;
+
+namespace Util.SystemTextJson {
+ ///
+ /// 可空日期格式Json转换器
+ ///
+ public class NullableDateTimeJsonConverter : JsonConverter {
+ ///
+ /// 日期格式
+ ///
+ private readonly string _format;
+
+ ///
+ /// 初始化可空日期格式Json转换器
+ ///
+ public NullableDateTimeJsonConverter() : this( "yyyy-MM-dd HH:mm:ss" ) {
+ }
+
+ ///
+ /// 初始化可空日期格式Json转换器
+ ///
+ /// 日期格式,默认值: yyyy-MM-dd HH:mm:ss
+ public NullableDateTimeJsonConverter( string format ) {
+ _format = format;
+ }
+
+ ///
+ /// 读取数据
+ ///
+ public override DateTime? Read( ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options ) {
+ if ( reader.TokenType == JsonTokenType.String ) {
+ return Time.Normalize( Convert.ToDateTime( reader.GetString() ) );
+ }
+ if ( reader.TryGetDateTime( out var date ) ) {
+ return Time.Normalize( date );
+ }
+ return DateTime.MinValue;
+ }
+
+ ///
+ /// 写入数据
+ ///
+ public override void Write( Utf8JsonWriter writer, DateTime? value, JsonSerializerOptions options ) {
+ if ( value == null ) {
+ writer.WriteNullValue();
+ return;
+ }
+ var date = Time.Normalize( value.Value ).ToString( _format );
+ writer.WriteStringValue( date );
+ }
+ }
+}
diff --git a/src/Util.Data.Abstractions/Stores/IQueryStore.cs b/src/Util.Data.Abstractions/Stores/IQueryStore.cs
index 207cdea1..d2670d44 100644
--- a/src/Util.Data.Abstractions/Stores/IQueryStore.cs
+++ b/src/Util.Data.Abstractions/Stores/IQueryStore.cs
@@ -21,7 +21,7 @@ namespace Util.Data.Stores {
///
/// 实体类型
/// 实体标识类型
- public interface IQueryStore : IFilterOperation,IScopeDependency where TEntity : class, IKey {
+ public interface IQueryStore : IFilterOperation,IScopeDependency,IDisposable where TEntity : class, IKey {
///
/// 获取查询对象
///
diff --git a/src/Util.Data.Abstractions/Stores/IStore.cs b/src/Util.Data.Abstractions/Stores/IStore.cs
index 306b5bd4..d528e52d 100644
--- a/src/Util.Data.Abstractions/Stores/IStore.cs
+++ b/src/Util.Data.Abstractions/Stores/IStore.cs
@@ -20,16 +20,6 @@ namespace Util.Data.Stores {
/// 对象类型
/// 对象标识类型
public interface IStore : IQueryStore where TEntity : class, IKey {
- ///
- /// 添加实体
- ///
- /// 实体
- void Add( [Valid] TEntity entity );
- ///
- /// 添加实体集合
- ///
- /// 实体集合
- void Add( [Valid] IEnumerable entities );
///
/// 添加实体
///
@@ -46,42 +36,14 @@ namespace Util.Data.Stores {
/// 修改实体
///
/// 实体
- void Update( [Valid] TEntity entity );
+ /// 取消令牌
+ Task UpdateAsync( [Valid] TEntity entity, CancellationToken cancellationToken = default );
///
/// 修改实体集合
///
/// 实体集合
- void Update( [Valid] IEnumerable entities );
- ///
- /// 修改实体
- ///
- /// 实体
- Task UpdateAsync( [Valid] TEntity entity );
- ///
- /// 修改实体集合
- ///
- /// 实体集合
- Task UpdateAsync( [Valid] IEnumerable entities );
- ///
- /// 移除实体
- ///
- /// 标识
- void Remove( object id );
- ///
- /// 移除实体
- ///
- /// 实体
- void Remove( TEntity entity );
- ///
- /// 移除实体集合
- ///
- /// 标识集合
- void Remove( IEnumerable ids );
- ///
- /// 移除实体集合
- ///
- /// 实体集合
- void Remove( IEnumerable entities );
+ /// 取消令牌
+ Task UpdateAsync( [Valid] IEnumerable entities, CancellationToken cancellationToken = default );
///
/// 移除实体
///
diff --git a/src/Util.Data.Core/01-Util.Data.Core.csproj b/src/Util.Data.Core/01-Util.Data.Core.csproj
index d1c19965..b9d39350 100644
--- a/src/Util.Data.Core/01-Util.Data.Core.csproj
+++ b/src/Util.Data.Core/01-Util.Data.Core.csproj
@@ -27,14 +27,14 @@
-
+
-
+
diff --git a/src/Util.Data.Core/IUnitOfWork.cs b/src/Util.Data.Core/IUnitOfWork.cs
index 7024875e..6012e623 100644
--- a/src/Util.Data.Core/IUnitOfWork.cs
+++ b/src/Util.Data.Core/IUnitOfWork.cs
@@ -8,10 +8,6 @@ namespace Util.Data {
///
[Util.Aop.Ignore]
public interface IUnitOfWork : IDisposable, IFilterOperation {
- ///
- /// 提交,返回影响的行数
- ///
- int Commit();
///
/// 提交,返回影响的行数
///
diff --git a/src/Util.Data.Core/Queries/Conditions/WhereIfNotEmptyCondition.cs b/src/Util.Data.Core/Queries/Conditions/WhereIfNotEmptyCondition.cs
index 486b62cc..4159572a 100644
--- a/src/Util.Data.Core/Queries/Conditions/WhereIfNotEmptyCondition.cs
+++ b/src/Util.Data.Core/Queries/Conditions/WhereIfNotEmptyCondition.cs
@@ -29,7 +29,7 @@ namespace Util.Data.Queries.Conditions {
if( _condition == null )
return null;
if( Lambda.GetConditionCount( _condition ) > 1 )
- throw new InvalidOperationException( string.Format( UtilCoreResource.CanOnlyOneCondition, _condition ) );
+ throw new InvalidOperationException( string.Format( R.CanOnlyOneCondition, _condition ) );
return _condition.Value().SafeString().IsEmpty() ? null : _condition;
}
}
diff --git a/src/Util.Data.Core/Trees/TreeCondition.cs b/src/Util.Data.Core/Trees/TreeCondition.cs
index fa74bfcd..9691c75b 100644
--- a/src/Util.Data.Core/Trees/TreeCondition.cs
+++ b/src/Util.Data.Core/Trees/TreeCondition.cs
@@ -34,9 +34,6 @@ namespace Util.Data.Trees {
Condition = Condition.And( t => t.Level == parameter.Level );
if( parameter.Enabled != null )
Condition = Condition.And( t => t.Enabled == parameter.Enabled );
- var parentId = Util.Helpers.Convert.To( parameter.ParentId );
- if( parameter.ParentId != null )
- Condition = Condition.And( t => t.ParentId.Equals(parentId) );
}
///
diff --git a/src/Util.Data.Dapper.All/05-Util.Data.Dapper.All.csproj b/src/Util.Data.Dapper.All/05-Util.Data.Dapper.All.csproj
new file mode 100644
index 00000000..a2271cfa
--- /dev/null
+++ b/src/Util.Data.Dapper.All/05-Util.Data.Dapper.All.csproj
@@ -0,0 +1,35 @@
+
+
+
+ $(NetTargetFramework)
+ icon.jpg
+ Util.Data.Dapper.All
+ Util.Data
+ Util.Data.Dapper.All是Util应用框架基于Dapper的数据访问封装类库,包含所有支持的数据库实现
+
+
+
+
+ .\obj\Debug\$(NetTargetFramework)\Util.Data.Dapper.All.xml
+
+
+
+
+ .\obj\Release\$(NetTargetFramework)\Util.Data.Dapper.All.xml
+
+
+
+
+ True
+ False
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Util.Data.Dapper.All/Infrastructure/DapperServiceRegistrar.cs b/src/Util.Data.Dapper.All/Infrastructure/DapperServiceRegistrar.cs
new file mode 100644
index 00000000..50e1408a
--- /dev/null
+++ b/src/Util.Data.Dapper.All/Infrastructure/DapperServiceRegistrar.cs
@@ -0,0 +1,41 @@
+using System;
+using Microsoft.Extensions.DependencyInjection.Extensions;
+using Microsoft.Extensions.Hosting;
+using Util.Data.Metadata;
+using Util.Infrastructure;
+using Util.Reflections;
+
+namespace Util.Data.Infrastructure {
+ ///
+ /// Dapper服务注册器
+ ///
+ public class DapperServiceRegistrar : IServiceRegistrar {
+ ///
+ /// 获取标识
+ ///
+ public static int GetId() => 790;
+
+ ///
+ /// 标识
+ ///
+ public int Id => GetId();
+
+ ///
+ /// 是否启用
+ ///
+ public bool Enabled => ServiceRegistrarConfig.Instance.IsEnabled( GetId() );
+
+ ///
+ /// 注册服务
+ ///
+ /// 主机生成器
+ /// 类型查找器
+ public Action Register( IHostBuilder hostBuilder, ITypeFinder finder ) {
+ hostBuilder.ConfigureServices( ( context, services ) => {
+ services.TryAddSingleton();
+ services.TryAddSingleton();
+ } );
+ return null;
+ }
+ }
+}
diff --git a/src/Util.Data.Dapper.All/Infrastructure/ServiceRegistrarConfigExtensions.cs b/src/Util.Data.Dapper.All/Infrastructure/ServiceRegistrarConfigExtensions.cs
new file mode 100644
index 00000000..a1650803
--- /dev/null
+++ b/src/Util.Data.Dapper.All/Infrastructure/ServiceRegistrarConfigExtensions.cs
@@ -0,0 +1,26 @@
+using Util.Infrastructure;
+
+namespace Util.Data.Infrastructure {
+ ///
+ /// Dapper服务注册器配置扩展
+ ///
+ public static class ServiceRegistrarConfigExtensions {
+ ///
+ /// 启用Dapper服务注册器
+ ///
+ /// 服务注册器配置
+ public static ServiceRegistrarConfig EnableDapperServiceRegistrar( this ServiceRegistrarConfig config ) {
+ config.Enable( DapperServiceRegistrar.GetId() );
+ return config;
+ }
+
+ ///
+ ///禁用Dapper服务注册器
+ ///
+ /// 服务注册器配置
+ public static ServiceRegistrarConfig DisableDapperServiceRegistrar( this ServiceRegistrarConfig config ) {
+ config.Disable( DapperServiceRegistrar.GetId() );
+ return config;
+ }
+ }
+}
diff --git a/src/Util.Data.Dapper.All/Metadata/MetadataServiceFactory.cs b/src/Util.Data.Dapper.All/Metadata/MetadataServiceFactory.cs
new file mode 100644
index 00000000..ef92101e
--- /dev/null
+++ b/src/Util.Data.Dapper.All/Metadata/MetadataServiceFactory.cs
@@ -0,0 +1,72 @@
+using System;
+using Util.Data.Sql;
+
+namespace Util.Data.Metadata {
+ ///
+ /// 数据库元数据服务工厂
+ ///
+ public class MetadataServiceFactory : IMetadataServiceFactory {
+ ///
+ /// 服务提供器
+ ///
+ private readonly IServiceProvider _serviceProvider;
+
+ ///
+ /// 初始化数据库元数据服务工厂
+ ///
+ /// 服务提供器
+ public MetadataServiceFactory( IServiceProvider serviceProvider ) {
+ _serviceProvider = serviceProvider;
+ }
+
+ ///
+ /// 创建数据库元数据服务
+ ///
+ /// 数据库类型
+ /// 数据库连接字符串
+ public IMetadataService Create( DatabaseType dbType,string connection ) {
+ switch ( dbType ) {
+ case DatabaseType.SqlServer:
+ return CreateSqlServerMetadataService( connection );
+ case DatabaseType.PgSql:
+ return CreatePgSqlMetadataService( connection );
+ case DatabaseType.MySql:
+ return CreateMySqlMetadataService( connection );
+ }
+ throw new NotImplementedException();
+ }
+
+ ///
+ /// 创建Sql Server数据库元数据服务
+ ///
+ private IMetadataService CreateSqlServerMetadataService( string connection ) {
+ var options = new SqlOptions {
+ ConnectionString = connection
+ };
+ var sqlQuery = new SqlServerSqlQuery( _serviceProvider, options );
+ return new SqlServerMetadataService( sqlQuery );
+ }
+
+ ///
+ /// 创建PostgreSql数据库元数据服务
+ ///
+ private IMetadataService CreatePgSqlMetadataService( string connection ) {
+ var options = new SqlOptions {
+ ConnectionString = connection
+ };
+ var sqlQuery = new PostgreSqlQuery( _serviceProvider, options );
+ return new PostgreSqlMetadataService( sqlQuery );
+ }
+
+ ///
+ /// 创建MySql数据库元数据服务
+ ///
+ private IMetadataService CreateMySqlMetadataService( string connection ) {
+ var options = new SqlOptions {
+ ConnectionString = connection
+ };
+ var sqlQuery = new MySqlQuery( _serviceProvider, options );
+ return new MySqlMetadataService( sqlQuery );
+ }
+ }
+}
diff --git a/src/Util.Data.Dapper.All/Metadata/TypeConverterFactory.cs b/src/Util.Data.Dapper.All/Metadata/TypeConverterFactory.cs
new file mode 100644
index 00000000..119b2fcc
--- /dev/null
+++ b/src/Util.Data.Dapper.All/Metadata/TypeConverterFactory.cs
@@ -0,0 +1,24 @@
+using System;
+
+namespace Util.Data.Metadata {
+ ///
+ /// 数据类型转换器工厂
+ ///
+ public class TypeConverterFactory : ITypeConverterFactory {
+ ///
+ /// 创建数据库元数据服务
+ ///
+ /// 数据库类型
+ public ITypeConverter Create( DatabaseType dbType ) {
+ switch ( dbType ) {
+ case DatabaseType.SqlServer:
+ return new SqlServerTypeConverter();
+ case DatabaseType.PgSql:
+ return new PostgreSqlTypeConverter();
+ case DatabaseType.MySql:
+ return new MySqlTypeConverter();
+ }
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/src/Util.Data.Dapper.Core/01-Util.Data.Dapper.Core.csproj b/src/Util.Data.Dapper.Core/01-Util.Data.Dapper.Core.csproj
new file mode 100644
index 00000000..59cf0cba
--- /dev/null
+++ b/src/Util.Data.Dapper.Core/01-Util.Data.Dapper.Core.csproj
@@ -0,0 +1,53 @@
+
+
+
+ $(NetTargetFramework)
+ icon.jpg
+ Util.Data.Dapper.Core
+ Util.Data
+ Util.Data.Dapper.Core是Util应用框架基于Dapper的数据访问封装基础类库
+
+
+
+
+ .\obj\Debug\$(NetTargetFramework)\Util.Data.Dapper.Core.xml
+
+
+
+
+ .\obj\Release\$(NetTargetFramework)\Util.Data.Dapper.Core.xml
+
+
+
+
+ True
+ False
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+ True
+ UtilDataDapperResource.resx
+
+
+
+
+
+ ResXFileCodeGenerator
+ UtilDataDapperResource.Designer.cs
+
+
+
+
diff --git a/src/Util.Data.Dapper.Core/Properties/UtilDataDapperResource.Designer.cs b/src/Util.Data.Dapper.Core/Properties/UtilDataDapperResource.Designer.cs
new file mode 100644
index 00000000..159163ae
--- /dev/null
+++ b/src/Util.Data.Dapper.Core/Properties/UtilDataDapperResource.Designer.cs
@@ -0,0 +1,81 @@
+//------------------------------------------------------------------------------
+//
+// 此代码由工具生成。
+// 运行时版本:4.0.30319.42000
+//
+// 对此文件的更改可能会导致不正确的行为,并且如果
+// 重新生成代码,这些更改将会丢失。
+//
+//------------------------------------------------------------------------------
+
+namespace Util.Data.Properties {
+ using System;
+
+
+ ///
+ /// 一个强类型的资源类,用于查找本地化的字符串等。
+ ///
+ // 此类是由 StronglyTypedResourceBuilder
+ // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
+ // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
+ // (以 /str 作为命令选项),或重新生成 VS 项目。
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class UtilDataDapperResource {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal UtilDataDapperResource() {
+ }
+
+ ///
+ /// 返回此类使用的缓存的 ResourceManager 实例。
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Util.Data.Properties.UtilDataDapperResource", typeof(UtilDataDapperResource).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// 重写当前线程的 CurrentUICulture 属性,对
+ /// 使用此强类型资源类的所有资源查找执行重写。
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// 查找类似 数据库连接字符串不能为空 的本地化字符串。
+ ///
+ internal static string ConnectionIsEmpty {
+ get {
+ return ResourceManager.GetString("ConnectionIsEmpty", resourceCulture);
+ }
+ }
+
+ ///
+ /// 查找类似 数据库工厂不能为空 的本地化字符串。
+ ///
+ internal static string DatabaseFactoryIsNull {
+ get {
+ return ResourceManager.GetString("DatabaseFactoryIsNull", resourceCulture);
+ }
+ }
+ }
+}
diff --git a/src/Util.Core/Properties/UtilCoreResource.resx b/src/Util.Data.Dapper.Core/Properties/UtilDataDapperResource.resx
similarity index 83%
rename from src/Util.Core/Properties/UtilCoreResource.resx
rename to src/Util.Data.Dapper.Core/Properties/UtilDataDapperResource.resx
index 2b4fa491..d7787e7a 100644
--- a/src/Util.Core/Properties/UtilCoreResource.resx
+++ b/src/Util.Data.Dapper.Core/Properties/UtilDataDapperResource.resx
@@ -117,37 +117,10 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
-
- 仅允许添加一个条件,条件:{0}
+
+ 数据库连接字符串不能为空
-
- 当前操作的数据已被其他人修改,请刷新后重试
-
-
- 天
-
-
- 其他用户正在执行该操作,请稍后再试
-
-
- 小时
-
-
- 标识不能为空
-
-
- 毫秒
-
-
- 分
-
-
- 秒
-
-
- 类型 {0} 不是枚举
-
-
- 请不要重复提交
+
+ 数据库工厂不能为空
\ No newline at end of file
diff --git a/src/Util.Data.Dapper.Core/Sql/SqlExecutorBase.cs b/src/Util.Data.Dapper.Core/Sql/SqlExecutorBase.cs
new file mode 100644
index 00000000..89f9dde2
--- /dev/null
+++ b/src/Util.Data.Dapper.Core/Sql/SqlExecutorBase.cs
@@ -0,0 +1,78 @@
+using System;
+using System.Threading.Tasks;
+using Dapper;
+
+namespace Util.Data.Sql {
+ ///
+ /// Sql执行器
+ ///
+ public abstract class SqlExecutorBase : SqlQueryBase, ISqlExecutor {
+
+ #region 构造方法
+
+ ///
+ /// 初始化Sql执行器
+ ///
+ /// 服务提供器
+ /// Sql配置
+ /// 数据库信息,用于接入其它数据源,比如EF DbContext
+ protected SqlExecutorBase( IServiceProvider serviceProvider, SqlOptions options, IDatabase database ) : base( serviceProvider,options, database ) {
+ }
+
+ #endregion
+
+ #region ExecuteAsync(执行增删改操作)
+
+ ///
+ /// 执行增删改操作
+ ///
+ /// 执行超时时间,单位:秒
+ public virtual async Task ExecuteAsync( int? timeout = null ) {
+ int result = 0;
+ try {
+ if ( ExecuteBefore() == false )
+ return 0;
+ var connection = GetConnection();
+ result = await connection.ExecuteAsync( GetSql(), Params, GetTransaction(), timeout );
+ return result;
+ }
+ catch ( Exception ) {
+ RollbackTransaction();
+ throw;
+ }
+ finally {
+ ExecuteAfter( result );
+ }
+ }
+
+ #endregion
+
+ #region ExecuteProcedureAsync(执行存储过程增删改操作)
+
+ ///
+ /// 执行存储过程增删改操作
+ ///
+ /// 存储过程
+ /// 执行超时时间,单位:秒
+ public async Task ExecuteProcedureAsync( string procedure, int? timeout = null ) {
+ int result = 0;
+ try {
+ if( ExecuteBefore() == false )
+ return default;
+ SetSql( GetProcedure( procedure ) );
+ var connection = GetConnection();
+ result = await connection.ExecuteAsync( GetSql(), Params, GetTransaction(), timeout, GetProcedureCommandType() );
+ return result;
+ }
+ catch ( Exception ) {
+ RollbackTransaction();
+ throw;
+ }
+ finally {
+ ExecuteAfter( result );
+ }
+ }
+
+ #endregion
+ }
+}
diff --git a/src/Util.Data.Dapper.Core/Sql/SqlQueryBase.cs b/src/Util.Data.Dapper.Core/Sql/SqlQueryBase.cs
new file mode 100644
index 00000000..9087099c
--- /dev/null
+++ b/src/Util.Data.Dapper.Core/Sql/SqlQueryBase.cs
@@ -0,0 +1,1411 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Dapper;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Logging.Abstractions;
+using Util.Data.Properties;
+using Util.Data.Sql.Builders;
+using Util.Data.Sql.Builders.Clauses;
+using Util.Data.Sql.Builders.Core;
+using Util.Data.Sql.Builders.Params;
+using Util.Data.Sql.Builders.Sets;
+using Util.Data.Sql.Configs;
+using Util.Data.Sql.Database;
+using Util.Helpers;
+
+namespace Util.Data.Sql {
+ ///
+ /// Sql查询对象
+ ///
+ public abstract class SqlQueryBase : ISqlQuery, ISqlPartAccessor, ISqlOptionsAccessor, IGetParameter, IClearParameters, IConnectionManager, ITransactionManager {
+
+ #region 字段
+
+ ///
+ /// 数据库信息
+ ///
+ private IDatabase _database;
+ ///
+ /// Sql配置
+ ///
+ protected readonly SqlOptions Options;
+ ///
+ /// Sql生成器
+ ///
+ private ISqlBuilder _sqlBuilder;
+ ///
+ /// 数据库连接
+ ///
+ private IDbConnection _connection;
+ ///
+ /// 事务
+ ///
+ private IDbTransaction _transaction;
+ ///
+ /// Sql结果字符串
+ ///
+ private string _sql;
+ ///
+ /// 动态参数列表
+ ///
+ private DynamicParameters _parameters;
+ ///
+ /// 参数字面值解析器
+ ///
+ private IParamLiteralsResolver _paramLiteralsResolver;
+
+ #endregion
+
+ #region 构造方法
+
+ ///
+ /// 初始化Sql查询对象
+ ///
+ /// 服务提供器
+ /// Sql配置
+ /// 数据库信息,用于接入其它数据源,比如EF DbContext
+ protected SqlQueryBase( IServiceProvider serviceProvider, SqlOptions options, IDatabase database ) {
+ ServiceProvider = serviceProvider ?? throw new ArgumentNullException( nameof( serviceProvider ) );
+ Options = options ?? throw new ArgumentNullException( nameof( options ) );
+ Logger = CreateLogger();
+ _connection = options.Connection;
+ _database = database;
+ ContextId = Id.Create();
+ }
+
+ ///
+ /// 创建日志
+ ///
+ private ILogger CreateLogger() {
+ var loggerFactory = ServiceProvider.GetService();
+ if ( loggerFactory == null )
+ return NullLogger.Instance;
+ return loggerFactory.CreateLogger( Options.LogCategory );
+ }
+
+ #endregion
+
+ #region 属性
+
+ ///
+ /// 上下文标识
+ ///
+ public string ContextId { get; private set; }
+ ///
+ /// 服务提供器
+ ///
+ protected IServiceProvider ServiceProvider { get; }
+ ///
+ /// 日志操作
+ ///
+ protected ILogger Logger { get; }
+ ///
+ /// 数据库信息
+ ///
+ protected IDatabase Database => _database ??= CreateDatabase();
+ ///
+ /// Sql生成器
+ ///
+ public ISqlBuilder SqlBuilder => _sqlBuilder ??= CreateSqlBuilder();
+ ///
+ /// Sql方言
+ ///
+ public IDialect Dialect => ( (ISqlPartAccessor)SqlBuilder ).Dialect;
+ ///
+ /// 参数管理器
+ ///
+ public IParameterManager ParameterManager => ( (ISqlPartAccessor)SqlBuilder ).ParameterManager;
+ ///
+ /// 参数字面值解析器
+ ///
+ protected IParamLiteralsResolver ParamLiteralsResolver => _paramLiteralsResolver ??= CreateParamLiteralsResolver();
+ ///
+ /// 起始子句
+ ///
+ public IStartClause StartClause => ( (ISqlPartAccessor)SqlBuilder ).StartClause;
+ ///
+ /// Insert子句
+ ///
+ public IFromClause FromClause => ( (ISqlPartAccessor)SqlBuilder ).FromClause;
+ ///
+ /// Join子句
+ ///
+ public IJoinClause JoinClause => ( (ISqlPartAccessor)SqlBuilder ).JoinClause;
+ ///
+ /// Where子句
+ ///
+ public IWhereClause WhereClause => ( (ISqlPartAccessor)SqlBuilder ).WhereClause;
+ ///
+ /// GroupBy子句
+ ///
+ public IInsertClause InsertClause => ( (ISqlPartAccessor)SqlBuilder ).InsertClause;
+ ///
+ /// Select子句
+ ///
+ public ISelectClause SelectClause => ( (ISqlPartAccessor)SqlBuilder ).SelectClause;
+ ///
+ /// From子句
+ ///
+ public IGroupByClause GroupByClause => ( (ISqlPartAccessor)SqlBuilder ).GroupByClause;
+ ///
+ /// OrderBy子句
+ ///
+ public IOrderByClause OrderByClause => ( (ISqlPartAccessor)SqlBuilder ).OrderByClause;
+ ///
+ /// 结束子句
+ ///
+ public IEndClause EndClause => ( (ISqlPartAccessor)SqlBuilder ).EndClause;
+ ///
+ /// Sql生成器集合
+ ///
+ public ISqlBuilderSet SqlBuilderSet => ( (ISqlPartAccessor)SqlBuilder ).SqlBuilderSet;
+ ///
+ /// 获取动态参数列表
+ ///
+ protected DynamicParameters Params {
+ get {
+ _parameters = new DynamicParameters();
+ ParameterManager.GetParams().ToList().ForEach( t => _parameters.Add( t.Name, t.Value, t.DbType, t.Direction, t.Size, t.Precision, t.Scale ) );
+ ParameterManager.GetDynamicParams().ToList().ForEach( p => _parameters.AddDynamicParams( p ) );
+ return _parameters;
+ }
+ }
+
+ ///
+ public SqlBuilderResult PreviousSql { get; private set; }
+
+ #endregion
+
+ #region 工厂方法
+
+ ///
+ /// 创建Sql生成器
+ ///
+ protected abstract ISqlBuilder CreateSqlBuilder();
+
+ ///
+ /// 创建数据库信息
+ ///
+ protected virtual IDatabase CreateDatabase() {
+ if ( Options.ConnectionString.IsEmpty() )
+ throw new InvalidOperationException( UtilDataDapperResource.ConnectionIsEmpty );
+ var factory = CreateDatabaseFactory();
+ if ( factory == null )
+ throw new InvalidOperationException( UtilDataDapperResource.DatabaseFactoryIsNull );
+ return factory.Create( Options.ConnectionString );
+ }
+
+ ///
+ /// 创建数据库工厂
+ ///
+ protected abstract IDatabaseFactory CreateDatabaseFactory();
+
+ ///
+ /// 创建判断是否存在Sql生成器
+ ///
+ /// Sql生成器
+ protected abstract IExistsSqlBuilder CreatExistsSqlBuilder( ISqlBuilder sqlBuilder );
+
+ ///
+ /// 创建参数字面值解析器
+ ///
+ protected virtual IParamLiteralsResolver CreateParamLiteralsResolver() {
+ return new ParamLiteralsResolver();
+ }
+
+ #endregion
+
+ #region GetOptions(获取Sql配置)
+
+ ///
+ /// 获取Sql配置
+ ///
+ public SqlOptions GetOptions() {
+ return Options;
+ }
+
+ #endregion
+
+ #region GetParam(获取Sql参数值)
+
+ ///
+ /// 获取Sql参数值
+ ///
+ /// 参数值类型
+ /// 参数名
+ public virtual T GetParam( string name ) {
+ if ( _parameters == null && PreviousSql != null )
+ return PreviousSql.GetParam( name );
+ return Params.Get( name );
+ }
+
+ #endregion
+
+ #region ClearParams(清空Sql参数)
+
+ ///
+ /// 清空Sql参数
+ ///
+ public void ClearParams() {
+ ParameterManager.Clear();
+ _parameters = null;
+ }
+
+ #endregion
+
+ #region GetConnection(获取数据库连接)
+
+ ///
+ /// 获取数据库连接
+ ///
+ public IDbConnection GetConnection() {
+ if ( _connection != null )
+ return _connection;
+ _connection = Database.GetConnection();
+ if ( _connection == null )
+ throw new InvalidOperationException( UtilDataDapperResource.ConnectionIsEmpty );
+ return _connection;
+ }
+
+ #endregion
+
+ #region SetConnection(设置数据库连接)
+
+ ///
+ /// 设置数据库连接
+ ///
+ /// 数据库连接
+ public void SetConnection( IDbConnection connection ) {
+ if ( connection == null )
+ return;
+ _connection = connection;
+ }
+
+ #endregion
+
+ #region GetTransaction(获取数据库事务)
+
+ ///
+ /// 获取数据库事务
+ ///
+ public IDbTransaction GetTransaction() {
+ return _transaction;
+ }
+
+ #endregion
+
+ #region SetTransaction(设置数据库事务)
+
+ ///
+ /// 设置数据库事务
+ ///
+ /// 数据库事务
+ public void SetTransaction( IDbTransaction transaction ) {
+ if ( transaction == null )
+ return;
+ _transaction = transaction;
+ _connection = transaction.Connection;
+ }
+
+ #endregion
+
+ #region BeginTransaction(开始事务)
+
+ ///
+ /// 开始事务
+ ///
+ public IDbTransaction BeginTransaction() {
+ return BeginTransactionImpl( null );
+ }
+
+ ///
+ /// 开始事务
+ ///
+ /// 隔离级别
+ public IDbTransaction BeginTransaction( IsolationLevel isolationLevel ) {
+ return BeginTransactionImpl( isolationLevel );
+ }
+
+ ///
+ /// 开始事务
+ ///
+ private IDbTransaction BeginTransactionImpl( IsolationLevel? isolationLevel ) {
+ try {
+ if ( _transaction != null )
+ return _transaction;
+ var connection = GetConnection();
+ if ( connection.State == ConnectionState.Closed )
+ connection.Open();
+ _transaction = isolationLevel == null ? connection.BeginTransaction() : connection.BeginTransaction( isolationLevel.SafeValue() );
+ return _transaction;
+ }
+ catch {
+ if ( _connection?.State == ConnectionState.Open )
+ _connection?.Close();
+ _transaction?.Dispose();
+ throw;
+ }
+ }
+
+ #endregion
+
+ #region CommitTransaction(提交事务)
+
+ ///
+ /// 提交事务
+ ///
+ public void CommitTransaction() {
+ try {
+ _transaction?.Commit();
+ }
+ catch {
+ _transaction?.Rollback();
+ throw;
+ }
+ finally {
+ if ( _connection?.State == ConnectionState.Open )
+ _connection?.Close();
+ _transaction?.Dispose();
+ _transaction = null;
+ }
+ }
+
+ #endregion
+
+ #region RollbackTransaction(回滚事务)
+
+ ///
+ /// 回滚事务
+ ///
+ public void RollbackTransaction() {
+ try {
+ if( _connection.State != ConnectionState.Closed )
+ _transaction?.Rollback();
+ }
+ finally {
+ if ( _connection?.State == ConnectionState.Open )
+ _connection?.Close();
+ _transaction?.Dispose();
+ _transaction = null;
+ }
+ }
+
+ #endregion
+
+ #region ExecuteExists(判断是否存在)
+
+ ///
+ /// 判断是否存在
+ ///
+ public bool ExecuteExists() {
+ object result = null;
+ try {
+ if ( ExecuteBefore() == false )
+ return default;
+ _sql = CreatExistsSqlBuilder( SqlBuilder ).GetSql();
+ var connection = GetConnection();
+ result = connection.ExecuteScalar( GetSql(), Params, GetTransaction() );
+ return Util.Helpers.Convert.ToBool( result );
+ }
+ finally {
+ ExecuteAfter( result );
+ }
+ }
+
+ #endregion
+
+ #region ExecuteExistsAsync(判断是否存在)
+
+ ///
+ /// 判断是否存在
+ ///
+ public async Task ExecuteExistsAsync() {
+ object result = null;
+ try {
+ if ( ExecuteBefore() == false )
+ return default;
+ _sql = CreatExistsSqlBuilder( SqlBuilder ).GetSql();
+ var connection = GetConnection();
+ result = await connection.ExecuteScalarAsync( GetSql(), Params, GetTransaction() );
+ return Util.Helpers.Convert.ToBool( result );
+ }
+ finally {
+ ExecuteAfter( result );
+ }
+ }
+
+ #endregion
+
+ #region ExecuteScalar(获取单值)
+
+ ///
+ /// 获取单值
+ ///
+ public virtual object ExecuteScalar( int? timeout = null ) {
+ object result = null;
+ try {
+ if ( ExecuteBefore() == false )
+ return default;
+ var connection = GetConnection();
+ result = connection.ExecuteScalar( GetSql(), Params, GetTransaction(), timeout );
+ return result;
+ }
+ finally {
+ ExecuteAfter( result );
+ }
+ }
+
+ ///
+ /// 获取单值
+ ///
+ public virtual T ExecuteScalar( int? timeout = null ) {
+ return Util.Helpers.Convert.To( ExecuteScalar( timeout ) );
+ }
+
+ #endregion
+
+ #region ExecuteScalarAsync(获取单值)
+
+ ///
+ /// 获取单值
+ ///
+ public virtual async Task