From 3dce669118cdfbe994733b46cefca62c71ffd573 Mon Sep 17 00:00:00 2001 From: Monk Date: Wed, 14 Oct 2020 10:17:28 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=98=9C=20update=20.net=205=20rc2=20final.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.en.md | 12 +-- README.md | 12 +-- docs/3ab56fdf.dc6c86e1.js | 1 - docs/3ab56fdf.e76ab20e.js | 1 + docs/404.html | 4 +- docs/4c30b939.bf1525bb.js | 1 + docs/7d3779e7.20c05f2d.js | 1 - docs/7d3779e7.c70af1ad.js | 1 + docs/8bbf9761.517fd551.js | 1 + docs/8bbf9761.f64cda87.js | 1 - docs/blog/index.html | 10 +- docs/blog/tags/fur/index.html | 10 +- docs/blog/tags/furos/index.html | 10 +- docs/blog/tags/index.html | 4 +- docs/blog/tags/net-5/index.html | 10 +- docs/blog/tags/net/index.html | 10 +- docs/blog/tags/netcore/index.html | 10 +- docs/blog/welcome/index.html | 10 +- docs/d3c206bc.5e7da086.js | 1 - docs/d3c206bc.dcf720c0.js | 1 + docs/docs/answer/index.html | 4 +- docs/docs/appstartup/index.html | 4 +- docs/docs/auth-control/index.html | 4 +- docs/docs/author/index.html | 4 +- docs/docs/cache/index.html | 4 +- docs/docs/configuration/index.html | 4 +- docs/docs/contribute/index.html | 4 +- docs/docs/cors/index.html | 4 +- docs/docs/data-validation/index.html | 4 +- docs/docs/dbcontext-Interceptor/index.html | 4 +- docs/docs/dbcontext-add-or-update/index.html | 4 +- docs/docs/dbcontext-add/index.html | 4 +- docs/docs/dbcontext-audit/index.html | 4 +- docs/docs/dbcontext-batch/index.html | 4 +- docs/docs/dbcontext-code-first/index.html | 4 +- docs/docs/dbcontext-db-first/index.html | 4 +- docs/docs/dbcontext-delete/index.html | 4 +- docs/docs/dbcontext-filter/index.html | 4 +- docs/docs/dbcontext-function/index.html | 4 +- docs/docs/dbcontext-hight-query/index.html | 4 +- docs/docs/dbcontext-locator/index.html | 4 +- docs/docs/dbcontext-multi-database/index.html | 4 +- docs/docs/dbcontext-proc/index.html | 4 +- docs/docs/dbcontext-query/index.html | 4 +- docs/docs/dbcontext-read-write/index.html | 4 +- docs/docs/dbcontext-repository/index.html | 4 +- docs/docs/dbcontext-seed-data/index.html | 4 +- docs/docs/dbcontext-sql-proxy/index.html | 4 +- docs/docs/dbcontext-sql-template/index.html | 4 +- docs/docs/dbcontext-sql/index.html | 4 +- docs/docs/dbcontext-update/index.html | 4 +- docs/docs/dbcontext-view/index.html | 4 +- docs/docs/dbcontext/index.html | 4 +- docs/docs/dependency-injection/index.html | 4 +- docs/docs/deploy/index.html | 4 +- docs/docs/devops/index.html | 4 +- docs/docs/dynamic-api-controller/index.html | 4 +- docs/docs/entity/index.html | 4 +- docs/docs/errors/index.html | 4 +- docs/docs/event-bus/index.html | 4 +- docs/docs/friendly-exception/index.html | 4 +- docs/docs/get-start/index.html | 4 +- docs/docs/gooduse/index.html | 4 +- docs/docs/grpc/index.html | 4 +- docs/docs/http/index.html | 4 +- docs/docs/index.html | 10 +- docs/docs/job/index.html | 4 +- docs/docs/local-language/index.html | 4 +- docs/docs/logging/index.html | 4 +- docs/docs/object-mapper/index.html | 11 ++- docs/docs/options/index.html | 4 +- docs/docs/performance/index.html | 4 +- docs/docs/process-service/index.html | 4 +- docs/docs/reference/index.html | 18 ++-- docs/docs/saas/index.html | 4 +- docs/docs/signalr/index.html | 4 +- docs/docs/source/index.html | 4 +- docs/docs/specification-document/index.html | 4 +- docs/docs/split-db/index.html | 4 +- docs/docs/tran/index.html | 4 +- docs/docs/unittest/index.html | 4 +- docs/docs/view-engine/index.html | 4 +- docs/index.html | 4 +- ...n.c11cdd7c.js => runtime~main.578a6a35.js} | 2 +- framework/.editorconfig | 2 +- .../Fur.Application/Fur.Application.csproj | 4 - .../Persons/PersonRelationshipService.cs | 1 - .../Fur.Application/Persons/PersonService.cs | 1 - .../Fur.Application/applicationsettings.json | 3 +- framework/Fur.Core/Fur.Core.csproj | 6 +- .../Fur.Database.Migrations.csproj | 4 - .../Fur.EntityFramework.Core.csproj | 6 +- framework/Fur.Web.Core/Fur.Web.Core.csproj | 4 - framework/Fur.Web.Entry/Fur.Web.Entry.csproj | 2 +- framework/Fur/App/App.cs | 2 +- .../Fur/App/Attributes/AppStartupAttribute.cs | 2 +- .../AppApplicationBuilderExtensions.cs | 2 +- .../AppServiceCollectionExtensions.cs | 2 +- .../App/Extensions/Types/ObjectExtensions.cs | 2 +- .../Extensions/WebHostBuilderExtensions.cs | 2 +- framework/Fur/App/Filters/StartupFilter.cs | 2 +- .../Fur/App/Options/AppSettingsOptions.cs | 2 +- framework/Fur/App/Proxies/IDispatchProxy.cs | 2 +- framework/Fur/App/Startups/AppStartup.cs | 2 +- framework/Fur/App/Startups/HostingStartup.cs | 2 +- .../Attributes/AuthorizePolicyAttribute.cs | 2 +- ...uthorizationServiceCollectionExtensions.cs | 2 +- .../Handlers/AuthorizePolicyHandler.cs | 2 +- .../Options/JWTSettingsOptions.cs | 2 +- framework/Fur/Authorization/Penetrates.cs | 2 +- .../Providers/AuthorizePolicyProvider.cs | 2 +- .../AuthorizePolicyRequirement.cs | 2 +- .../Attributes/OptionsSettingsAttribute.cs | 2 +- ...rableOptionsServiceCollectionExtensions.cs | 2 +- .../Options/IConfigurableOptions.cs | 2 +- ...orsAccessorApplicationBuilderExtensions.cs | 2 +- ...CorsAccessorServiceCollectionExtensions.cs | 2 +- .../Options/CorsAccessorSettingsOptions.cs | 2 +- framework/Fur/DataEncryption/AESEncryption.cs | 2 +- .../Fur/DataEncryption/DESCEncryption.cs | 2 +- framework/Fur/DataEncryption/MD5Encryption.cs | 2 +- .../Attributes/DataValidationAttribute.cs | 2 +- .../Attributes/NonValidationAttribute.cs | 2 +- .../ValidationItemMetadataAttribute.cs | 2 +- .../Attributes/ValidationMessageAttribute.cs | 2 +- .../ValidationMessageTypeAttribute.cs | 2 +- .../Attributes/ValidationTypeAttribute.cs | 2 +- .../DataValidation/Enums/ValidationPattern.cs | 2 +- .../DataValidation/Enums/ValidationTypes.cs | 2 +- .../Extensions/DataValidationExtensions.cs | 2 +- ...taValidationServiceCollectionExtensions.cs | 2 +- .../Filters/DataValidationFilter.cs | 2 +- .../Models/DataValidationResult.cs | 2 +- .../ValidationTypeMessageSettingsOptions.cs | 2 +- .../IValidationMessageTypeProvider.cs | 2 +- .../Validators/DataValidator.cs | 2 +- .../Basics/SqlObjectProxyAttribute.cs | 2 +- .../Attributes/Basics/SqlProxyAttribute.cs | 2 +- .../Basics/SqlSentenceProxyAttribute.cs | 2 +- .../Attributes/SqlExecuteAttribute.cs | 2 +- .../Attributes/SqlFunctionAttribute.cs | 2 +- .../Attributes/SqlProcedureAttribute.cs | 2 +- .../Dependencies/ISqlDispatchProxy.cs | 2 +- .../Advances/Models/SqlProxyMethod.cs | 2 +- .../Advances/Proxies/SqlDispatchProxy.cs | 2 +- .../Attributes/DbParameterAttribute.cs | 2 +- .../DatabaseAccessor/Contexts/AppDbContext.cs | 2 +- .../Attributes/AppDbContextAttribute.cs | 2 +- .../Contexts/Builders/AppDbContextBuilder.cs | 2 +- .../Models/DbContextCorrelationType.cs | 2 +- framework/Fur/DatabaseAccessor/Db.cs | 2 +- .../DynamicModelCacheKeyFactory.cs | 2 +- .../DynamicModels/IEntityMutableTable.cs | 2 +- .../Attributes/FakeDeleteAttribute.cs | 2 +- .../Attributes/NonAutomaticAttribute.cs | 2 +- .../Attributes/QueryableFunctionAttribute.cs | 2 +- .../Entities/Configures/IEntitySeedData.cs | 2 +- .../Entities/Configures/IEntityTypeBuilder.cs | 2 +- .../Configures/IModelBuilderFilter.cs | 2 +- .../Configures/IPrivateModelBuilder.cs | 2 +- .../Entities/Dependencies/Entity.cs | 2 +- .../Entities/Dependencies/EntityBase.cs | 2 +- .../Entities/Dependencies/EntityNotKey.cs | 2 +- .../Entities/Dependencies/IEntity.cs | 2 +- .../Entities/Dependencies/IEntityNotKey.cs | 2 +- .../DatabaseAccessor/Enums/DbFunctionType.cs | 2 +- .../DatabaseAccessor/Enums/ManualOptions.cs | 2 +- ...baseAccessorServiceCollectionExtensions.cs | 2 +- .../DatabaseFacade/DbDataConvertExtensions.cs | 2 +- .../DatabaseFacade/DbObjectExtensions.cs | 2 +- .../DatabaseFacade/SqlAdoNetExtensions.cs | 2 +- ...baseProviderServiceCollectionExtensions.cs | 2 +- .../Extensions/DatabaseProvider/Penetrates.cs | 2 +- .../Extensions/PagedQueryableExtensions.cs | 2 +- .../Repositories/IEntityExtensions.cs | 2 +- .../IEntityWithDbContextLocatorExtensions.cs | 2 +- .../Extensions/Repositories/SqlExtensions.cs | 2 +- .../Fur/DatabaseAccessor/Helpers/DbHelpers.cs | 2 +- .../DbContextSaveChangesInterceptor.cs | 2 +- .../SqlCommandProfilerInterceptor.cs | 2 +- .../SqlConnectionProfilerInterceptor.cs | 2 +- .../Locators/IDbContextLocator.cs | 2 +- .../Locators/MasterDbContextLocator.cs | 2 +- .../Fur/DatabaseAccessor/Models/DbProvider.cs | 2 +- .../Fur/DatabaseAccessor/Models/PagedList.cs | 2 +- .../Models/ProcedureOutputResult.cs | 2 +- .../Models/ProcedureOutputValue.cs | 2 +- .../DatabaseAccessor/Models/SqlTemplate.cs | 2 +- .../Models/SqlTemplateParameter.cs | 2 +- .../Dependencies/IMultiTenantOnDatabase.cs | 2 +- .../Dependencies/IMultiTenantOnSchema.cs | 2 +- .../Dependencies/IMultiTenantOnTable.cs | 2 +- .../Dependencies/IPrivateMultiTenant.cs | 2 +- .../MultiTenants/Entities/Tenant.cs | 2 +- .../MultiTenants/Enums/MultiTenantOptions.cs | 2 +- .../Locators/MultiTenantDbContextLocator.cs | 2 +- .../DatabaseAccessor/Pools/DbContextPool.cs | 2 +- .../DatabaseAccessor/Pools/IDbContextPool.cs | 2 +- .../Dependencies/IDeletableRepository.cs | 2 +- .../Dependencies/IInsertableRepository.cs | 2 +- .../Dependencies/IOperableRepository.cs | 2 +- .../Dependencies/IReadableRepository.cs | 2 +- .../Dependencies/IRepositoryDependency.cs | 2 +- .../Dependencies/ISqlExecutableRepository.cs | 2 +- .../Dependencies/ISqlReaderRepository.cs | 2 +- .../Dependencies/IUpdateableRepository.cs | 2 +- .../Dependencies/IWritableRepository.cs | 2 +- .../Repositories/EFCoreRepository.cs | 2 +- .../Repositories/IMSRepository.cs | 2 +- .../Repositories/IRepository.cs | 2 +- .../Repositories/ISqlRepository.cs | 2 +- .../Implantations/DeletableRepository.cs | 2 +- .../Implantations/InsertableRepository.cs | 2 +- .../Implantations/OperableRepository.cs | 2 +- .../Implantations/ReadableRepository.cs | 2 +- .../Implantations/SqlExecutableRepository.cs | 2 +- .../Implantations/SqlReaderRepository.cs | 2 +- .../Implantations/UpdateableRepository.cs | 2 +- .../Implantations/WritableRepository.cs | 2 +- .../Repositories/MSRepository.cs | 2 +- .../Repositories/SqlRepository.cs | 2 +- .../Attributes/NonTransactAttribute.cs | 2 +- .../Attributes/UnitOfWorkAttribute.cs | 2 +- .../UnitOfWork/Filters/UnitOfWorkFilter.cs | 2 +- .../Attributes/InjectionAttribute.cs | 2 +- .../Attributes/SkipScanAttribute.cs | 2 +- .../Dependencies/IPrivateDependency.cs | 2 +- .../Dependencies/IScoped.cs | 2 +- .../Dependencies/ISingleton.cs | 2 +- .../Dependencies/ITransient.cs | 2 +- .../Enums/InjectionActions.cs | 2 +- .../Enums/InjectionPatterns.cs | 2 +- .../DependencyInjection/Enums/RegisterType.cs | 2 +- ...ncyInjectionServiceCollectionExtensions.cs | 2 +- .../Models/ExternalService.cs | 2 +- .../DependencyInjectionSettingsOptions.cs | 2 +- .../ApiDescriptionSettingsAttribute.cs | 2 +- .../Attributes/ApiSeatAttribute.cs | 2 +- .../DynamicApiControllerAttribute.cs | 2 +- ...ApiControllerApplicationModelConvention.cs | 2 +- .../Dependencies/IDynamicApiController.cs | 2 +- .../DynamicApiController/Enums/ApiSeats.cs | 2 +- ...piControllerServiceCollectionExtensions.cs | 2 +- .../Models/ParameterRouteTemplate.cs | 2 +- .../DynamicApiControllerSettingsOptions.cs | 2 +- .../Fur/DynamicApiController/Penetrates.cs | 2 +- .../DynamicApiControllerFeatureProvider.cs | 2 +- .../ErrorCodeItemMetadataAttribute.cs | 2 +- .../Attributes/ErrorCodeTypeAttribute.cs | 2 +- .../Attributes/IfExceptionAttribute.cs | 2 +- ...dlyExceptionServiceCollectionExtensions.cs | 2 +- .../Filters/FriendlyExceptionFilter.cs | 2 +- .../Models/MethodIfException.cs | 2 +- framework/Fur/FriendlyException/Oops.cs | 2 +- .../ErrorCodeMessageSettingsOptions.cs | 2 +- .../Providers/IErrorCodeTypeProvider.cs | 2 +- framework/Fur/Fur.csproj | 12 +-- framework/Fur/FurStartup.cs | 2 +- .../LinqBuilder/Builders/LinqExpression.cs | 2 +- .../LinqBuilder/Extensions/LinqExtensions.cs | 2 +- .../ParameterReplaceExpressionVisitor.cs | 2 +- .../Dependencies/IObjectMapper.cs | 2 +- ...ObjectMapperServiceCollectionExtensions.cs | 2 +- .../Builders/SpecificationDocumentBuilder.cs | 6 +- ...ionDocumentApplicationBuilderExtensions.cs | 2 +- ...tionDocumentServiceCollectionExtensions.cs | 2 +- .../Filters/EnumSchemaFilter.cs | 6 +- .../Models/GroupOrder.cs | 2 +- .../Models/SpecificationOpenApiInfo.cs | 2 +- ...ificationOpenApiSecurityRequirementItem.cs | 2 +- .../SpecificationOpenApiSecurityScheme.cs | 2 +- .../SpecificationDocumentSettingsOptions.cs | 4 +- .../UnifyResultServiceCollectionExtensions.cs | 2 +- .../Filters/SuccessUnifyResultFilter.cs | 2 +- .../Fur/UnifyResult/Models/RESTfulResult.cs | 2 +- .../Providers/IUnifyResultProvider.cs | 2 +- .../Providers/RESTfulResultProvider.cs | 2 +- .../IViewEngineCompilationOptionsBuilder.cs | 2 +- .../ViewEngineCompilationOptionsBuilder.cs | 2 +- .../ViewEngineCompilationException.cs | 2 +- .../Exceptions/ViewEngineException.cs | 2 +- framework/Fur/ViewEngine/IViewEngine.cs | 2 +- .../ViewEngine/Models/AnonymousTypeWrapper.cs | 2 +- .../Options/ViewEngineCompilationOptions.cs | 2 +- .../Templates/IViewEngineCompiledTemplate.cs | 2 +- .../Templates/IViewEngineTemplate.cs | 2 +- .../Templates/ViewEngineCompiledTemplate.cs | 2 +- .../Templates/ViewEngineTemplate.cs | 2 +- framework/Fur/ViewEngine/ViewEngine.cs | 2 +- handbook/blog/2020-08-19-welcome.mdx | 8 +- handbook/build/3ab56fdf.2056ea25.js | 1 + handbook/build/3ab56fdf.d254137a.js | 1 - handbook/build/404.html | 4 +- handbook/build/4c30b939.7af2ecca.js | 1 - .../build/4c30b939.fe27c972.js | 2 +- handbook/build/7d3779e7.36728c1d.js | 1 + handbook/build/7d3779e7.e94a61da.js | 1 - handbook/build/8bbf9761.bb6f6ac0.js | 1 - handbook/build/8bbf9761.c680d101.js | 1 + handbook/build/blog/index.html | 10 +- handbook/build/blog/tags/fur/index.html | 10 +- handbook/build/blog/tags/furos/index.html | 10 +- handbook/build/blog/tags/index.html | 4 +- handbook/build/blog/tags/net-5/index.html | 10 +- handbook/build/blog/tags/net/index.html | 10 +- handbook/build/blog/tags/netcore/index.html | 10 +- handbook/build/blog/welcome/index.html | 10 +- handbook/build/d3c206bc.2684bdea.js | 1 - handbook/build/d3c206bc.f0d9082a.js | 1 + handbook/build/docs/answer/index.html | 4 +- handbook/build/docs/appstartup/index.html | 4 +- handbook/build/docs/auth-control/index.html | 4 +- handbook/build/docs/author/index.html | 4 +- handbook/build/docs/cache/index.html | 4 +- handbook/build/docs/configuration/index.html | 4 +- handbook/build/docs/contribute/index.html | 4 +- handbook/build/docs/cors/index.html | 4 +- .../build/docs/data-validation/index.html | 4 +- .../docs/dbcontext-Interceptor/index.html | 4 +- .../docs/dbcontext-add-or-update/index.html | 4 +- handbook/build/docs/dbcontext-add/index.html | 4 +- .../build/docs/dbcontext-audit/index.html | 4 +- .../build/docs/dbcontext-batch/index.html | 4 +- .../docs/dbcontext-code-first/index.html | 4 +- .../build/docs/dbcontext-db-first/index.html | 4 +- .../build/docs/dbcontext-delete/index.html | 4 +- .../build/docs/dbcontext-filter/index.html | 4 +- .../build/docs/dbcontext-function/index.html | 4 +- .../docs/dbcontext-hight-query/index.html | 4 +- .../build/docs/dbcontext-locator/index.html | 4 +- .../docs/dbcontext-multi-database/index.html | 4 +- handbook/build/docs/dbcontext-proc/index.html | 4 +- .../build/docs/dbcontext-query/index.html | 4 +- .../docs/dbcontext-read-write/index.html | 4 +- .../docs/dbcontext-repository/index.html | 4 +- .../build/docs/dbcontext-seed-data/index.html | 4 +- .../build/docs/dbcontext-sql-proxy/index.html | 4 +- .../docs/dbcontext-sql-template/index.html | 4 +- handbook/build/docs/dbcontext-sql/index.html | 4 +- .../build/docs/dbcontext-update/index.html | 4 +- handbook/build/docs/dbcontext-view/index.html | 4 +- handbook/build/docs/dbcontext/index.html | 4 +- .../docs/dependency-injection/index.html | 4 +- handbook/build/docs/deploy/index.html | 4 +- handbook/build/docs/devops/index.html | 4 +- .../docs/dynamic-api-controller/index.html | 4 +- handbook/build/docs/entity/index.html | 4 +- handbook/build/docs/errors/index.html | 4 +- handbook/build/docs/event-bus/index.html | 4 +- .../build/docs/friendly-exception/index.html | 4 +- handbook/build/docs/get-start/index.html | 4 +- handbook/build/docs/gooduse/index.html | 4 +- handbook/build/docs/grpc/index.html | 4 +- handbook/build/docs/http/index.html | 4 +- handbook/build/docs/index.html | 10 +- handbook/build/docs/job/index.html | 4 +- handbook/build/docs/local-language/index.html | 4 +- handbook/build/docs/logging/index.html | 4 +- handbook/build/docs/object-mapper/index.html | 11 ++- handbook/build/docs/options/index.html | 4 +- handbook/build/docs/performance/index.html | 4 +- .../build/docs/process-service/index.html | 4 +- handbook/build/docs/reference/index.html | 18 ++-- handbook/build/docs/saas/index.html | 4 +- handbook/build/docs/signalr/index.html | 4 +- handbook/build/docs/source/index.html | 4 +- .../docs/specification-document/index.html | 4 +- handbook/build/docs/split-db/index.html | 4 +- handbook/build/docs/tran/index.html | 4 +- handbook/build/docs/unittest/index.html | 4 +- handbook/build/docs/view-engine/index.html | 4 +- handbook/build/index.html | 4 +- ...n.9427b071.js => runtime~main.cff1907f.js} | 2 +- handbook/docs/introduce.mdx | 8 +- handbook/docs/object-mapper.mdx | 94 ++++++++++++++++++- handbook/docs/reference.mdx | 67 ++++++------- 376 files changed, 716 insertions(+), 666 deletions(-) delete mode 100644 docs/3ab56fdf.dc6c86e1.js create mode 100644 docs/3ab56fdf.e76ab20e.js create mode 100644 docs/4c30b939.bf1525bb.js delete mode 100644 docs/7d3779e7.20c05f2d.js create mode 100644 docs/7d3779e7.c70af1ad.js create mode 100644 docs/8bbf9761.517fd551.js delete mode 100644 docs/8bbf9761.f64cda87.js delete mode 100644 docs/d3c206bc.5e7da086.js create mode 100644 docs/d3c206bc.dcf720c0.js rename docs/{runtime~main.c11cdd7c.js => runtime~main.578a6a35.js} (95%) create mode 100644 handbook/build/3ab56fdf.2056ea25.js delete mode 100644 handbook/build/3ab56fdf.d254137a.js delete mode 100644 handbook/build/4c30b939.7af2ecca.js rename docs/4c30b939.95d3ea2a.js => handbook/build/4c30b939.fe27c972.js (70%) create mode 100644 handbook/build/7d3779e7.36728c1d.js delete mode 100644 handbook/build/7d3779e7.e94a61da.js delete mode 100644 handbook/build/8bbf9761.bb6f6ac0.js create mode 100644 handbook/build/8bbf9761.c680d101.js delete mode 100644 handbook/build/d3c206bc.2684bdea.js create mode 100644 handbook/build/d3c206bc.f0d9082a.js rename handbook/build/{runtime~main.9427b071.js => runtime~main.cff1907f.js} (65%) diff --git a/README.en.md b/README.en.md index f0711fe1b3f..8607da1bdd9 100644 --- a/README.en.md +++ b/README.en.md @@ -7,7 +7,7 @@
-[![star](https://gitee.com/monksoul/Fur/badge/star.svg?theme=gvp)](https://gitee.com/monksoul/Fur/stargazers) [![fork](https://gitee.com/monksoul/Fur/badge/fork.svg?theme=gvp)](https://gitee.com/monksoul/Fur/members) [![GitHub stars](https://img.shields.io/github/stars/MonkSoul/Fur?logo=github)](https://github.com/MonkSoul/Fur/stargazers) [![GitHub forks](https://img.shields.io/github/forks/MonkSoul/Fur?logo=github)](https://github.com/MonkSoul/Fur/network) [![GitHub license](https://img.shields.io/github/license/MonkSoul/Fur)](https://github.com/MonkSoul/Fur/blob/main/LICENSE) [![nuget](https://img.shields.io/badge/Nuget-1.0.0--rc2-brightgreen)](https://www.nuget.org/packages/Fur) +[![star](https://gitee.com/monksoul/Fur/badge/star.svg?theme=gvp)](https://gitee.com/monksoul/Fur/stargazers) [![fork](https://gitee.com/monksoul/Fur/badge/fork.svg?theme=gvp)](https://gitee.com/monksoul/Fur/members) [![GitHub stars](https://img.shields.io/github/stars/MonkSoul/Fur?logo=github)](https://github.com/MonkSoul/Fur/stargazers) [![GitHub forks](https://img.shields.io/github/forks/MonkSoul/Fur?logo=github)](https://github.com/MonkSoul/Fur/network) [![GitHub license](https://img.shields.io/github/license/MonkSoul/Fur)](https://github.com/MonkSoul/Fur/blob/main/LICENSE) [![nuget](https://img.shields.io/badge/Nuget-1.0.0--rc.final-blue)](https://www.nuget.org/packages/Fur)
@@ -19,11 +19,11 @@ ## ✨ 立即尝鲜 ✨ -`Fur` **是基于最新的 .NET 5 RC1 构建,目的是为了尽早体验新功能,对即将到来的 .NET 5 正式版做出最快的响应。** ✈ +`Fur` **是基于最新的 .NET 5 RC2 构建,目的是为了尽早体验新功能,对即将到来的 .NET 5 正式版做出最快的响应。** ✈ 所以运行 `Fur` 需要以下两个条件: -- **安装最新的 v5.0.0-rc.1**:https://dotnet.microsoft.com/download/dotnet/5.0 +- **安装最新的 v5.0.0-rc.2**:https://dotnet.microsoft.com/download/dotnet/5.0 - **安装最新的 Visual Studio 2019 Preview**:https://visualstudio.microsoft.com/zh-hans/vs/preview/ 或使用 **Visual Studio Code** 打开 `framework` 目录 @@ -81,7 +81,7 @@ - `Docker Hub` 线上镜像 ```shell -docker run --name fur -p 5000:80 monksoul/fur:v1.0.0-2020.10.14 +docker run --name fur -p 5000:80 monksoul/fur:v1.0.0-rc.final ``` - `手动` 打包镜像 @@ -89,13 +89,13 @@ docker run --name fur -p 5000:80 monksoul/fur:v1.0.0-2020.10.14 打开 `CMD/Shell/PowerShell` 进入 `Fur` 项目根目录打包 `Fur` 镜像: ```shell -docker build -t fur:v1.0.0-2020.10.14 . +docker build -t fur:v1.0.0-rc.final . ``` 打包成功后,直接 `docker run`: ```shell -docker run --name fur -p 5000:80 fur:v1.0.0-2020.10.14 +docker run --name fur -p 5000:80 fur:v1.0.0-rc.final ``` ## 🥞 架构设计 diff --git a/README.md b/README.md index f0711fe1b3f..8607da1bdd9 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@
-[![star](https://gitee.com/monksoul/Fur/badge/star.svg?theme=gvp)](https://gitee.com/monksoul/Fur/stargazers) [![fork](https://gitee.com/monksoul/Fur/badge/fork.svg?theme=gvp)](https://gitee.com/monksoul/Fur/members) [![GitHub stars](https://img.shields.io/github/stars/MonkSoul/Fur?logo=github)](https://github.com/MonkSoul/Fur/stargazers) [![GitHub forks](https://img.shields.io/github/forks/MonkSoul/Fur?logo=github)](https://github.com/MonkSoul/Fur/network) [![GitHub license](https://img.shields.io/github/license/MonkSoul/Fur)](https://github.com/MonkSoul/Fur/blob/main/LICENSE) [![nuget](https://img.shields.io/badge/Nuget-1.0.0--rc2-brightgreen)](https://www.nuget.org/packages/Fur) +[![star](https://gitee.com/monksoul/Fur/badge/star.svg?theme=gvp)](https://gitee.com/monksoul/Fur/stargazers) [![fork](https://gitee.com/monksoul/Fur/badge/fork.svg?theme=gvp)](https://gitee.com/monksoul/Fur/members) [![GitHub stars](https://img.shields.io/github/stars/MonkSoul/Fur?logo=github)](https://github.com/MonkSoul/Fur/stargazers) [![GitHub forks](https://img.shields.io/github/forks/MonkSoul/Fur?logo=github)](https://github.com/MonkSoul/Fur/network) [![GitHub license](https://img.shields.io/github/license/MonkSoul/Fur)](https://github.com/MonkSoul/Fur/blob/main/LICENSE) [![nuget](https://img.shields.io/badge/Nuget-1.0.0--rc.final-blue)](https://www.nuget.org/packages/Fur)
@@ -19,11 +19,11 @@ ## ✨ 立即尝鲜 ✨ -`Fur` **是基于最新的 .NET 5 RC1 构建,目的是为了尽早体验新功能,对即将到来的 .NET 5 正式版做出最快的响应。** ✈ +`Fur` **是基于最新的 .NET 5 RC2 构建,目的是为了尽早体验新功能,对即将到来的 .NET 5 正式版做出最快的响应。** ✈ 所以运行 `Fur` 需要以下两个条件: -- **安装最新的 v5.0.0-rc.1**:https://dotnet.microsoft.com/download/dotnet/5.0 +- **安装最新的 v5.0.0-rc.2**:https://dotnet.microsoft.com/download/dotnet/5.0 - **安装最新的 Visual Studio 2019 Preview**:https://visualstudio.microsoft.com/zh-hans/vs/preview/ 或使用 **Visual Studio Code** 打开 `framework` 目录 @@ -81,7 +81,7 @@ - `Docker Hub` 线上镜像 ```shell -docker run --name fur -p 5000:80 monksoul/fur:v1.0.0-2020.10.14 +docker run --name fur -p 5000:80 monksoul/fur:v1.0.0-rc.final ``` - `手动` 打包镜像 @@ -89,13 +89,13 @@ docker run --name fur -p 5000:80 monksoul/fur:v1.0.0-2020.10.14 打开 `CMD/Shell/PowerShell` 进入 `Fur` 项目根目录打包 `Fur` 镜像: ```shell -docker build -t fur:v1.0.0-2020.10.14 . +docker build -t fur:v1.0.0-rc.final . ``` 打包成功后,直接 `docker run`: ```shell -docker run --name fur -p 5000:80 fur:v1.0.0-2020.10.14 +docker run --name fur -p 5000:80 fur:v1.0.0-rc.final ``` ## 🥞 架构设计 diff --git a/docs/3ab56fdf.dc6c86e1.js b/docs/3ab56fdf.dc6c86e1.js deleted file mode 100644 index 3a68c7e2e04..00000000000 --- a/docs/3ab56fdf.dc6c86e1.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{142:function(e,t,a){"use strict";a.d(t,"a",(function(){return u})),a.d(t,"b",(function(){return g}));var r=a(0),n=a.n(r);function b(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function c(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var b=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=n.a.createContext({}),o=function(e){var t=n.a.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},u=function(e){var t=o(e.components);return n.a.createElement(p.Provider,{value:t},e.children)},O={inlineCode:"code",wrapper:function(e){var t=e.children;return n.a.createElement(n.a.Fragment,{},t)}},m=n.a.forwardRef((function(e,t){var a=e.components,r=e.mdxType,b=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=o(a),m=r,g=u["".concat(c,".").concat(m)]||u[m]||O[m]||b;return a?n.a.createElement(g,l(l({ref:t},p),{},{components:a})):n.a.createElement(g,l({ref:t},p))}));function g(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var b=a.length,c=new Array(b);c[0]=m;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l.mdxType="string"==typeof e?e:r,c[1]=l;for(var p=2;p=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var b=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=n.a.createContext({}),o=function(e){var t=n.a.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},u=function(e){var t=o(e.components);return n.a.createElement(p.Provider,{value:t},e.children)},O={inlineCode:"code",wrapper:function(e){var t=e.children;return n.a.createElement(n.a.Fragment,{},t)}},m=n.a.forwardRef((function(e,t){var a=e.components,r=e.mdxType,b=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=o(a),m=r,j=u["".concat(c,".").concat(m)]||u[m]||O[m]||b;return a?n.a.createElement(j,l(l({ref:t},p),{},{components:a})):n.a.createElement(j,l({ref:t},p))}));function j(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var b=a.length,c=new Array(b);c[0]=m;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l.mdxType="string"==typeof e?e:r,c[1]=l;for(var p=2;p Page Not Found | Fur - +

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- + \ No newline at end of file diff --git a/docs/4c30b939.bf1525bb.js b/docs/4c30b939.bf1525bb.js new file mode 100644 index 00000000000..e4abaf2d2d7 --- /dev/null +++ b/docs/4c30b939.bf1525bb.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{142:function(e,t,a){"use strict";a.d(t,"a",(function(){return u})),a.d(t,"b",(function(){return j}));var r=a(0),n=a.n(r);function b(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function c(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var b=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=n.a.createContext({}),o=function(e){var t=n.a.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=o(e.components);return n.a.createElement(p.Provider,{value:t},e.children)},O={inlineCode:"code",wrapper:function(e){var t=e.children;return n.a.createElement(n.a.Fragment,{},t)}},m=n.a.forwardRef((function(e,t){var a=e.components,r=e.mdxType,b=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=o(a),m=r,j=u["".concat(c,".").concat(m)]||u[m]||O[m]||b;return a?n.a.createElement(j,i(i({ref:t},p),{},{components:a})):n.a.createElement(j,i({ref:t},p))}));function j(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var b=a.length,c=new Array(b);c[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i.mdxType="string"==typeof e?e:r,c[1]=i;for(var p=2;p=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=a.a.createContext({}),b=function(e){var t=a.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=b(e.components);return a.a.createElement(l.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},s=a.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,c=e.parentName,l=p(e,["components","mdxType","originalType","parentName"]),u=b(n),s=r,m=u["".concat(c,".").concat(s)]||u[s]||d[s]||o;return n?a.a.createElement(m,i(i({ref:t},l),{},{components:n})):a.a.createElement(m,i({ref:t},l))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,c=new Array(o);c[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i.mdxType="string"==typeof e?e:r,c[1]=i;for(var l=2;l=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var b=r.a.createContext({}),s=function(e){var t=r.a.useContext(b),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},d=function(e){var t=s(e.components);return r.a.createElement(b.Provider,{value:t},e.children)},l={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},m=r.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,c=e.originalType,i=e.parentName,b=o(e,["components","mdxType","originalType","parentName"]),d=s(n),m=a,O=d["".concat(i,".").concat(m)]||d[m]||l[m]||c;return n?r.a.createElement(O,p(p({ref:t},b),{},{components:n})):r.a.createElement(O,p({ref:t},b))}));function O(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var c=n.length,i=new Array(c);i[0]=m;var p={};for(var o in t)hasOwnProperty.call(t,o)&&(p[o]=t[o]);p.originalType=e,p.mdxType="string"==typeof e?e:a,i[1]=p;for(var b=2;bMapster \u4f7f\u7528",id:"123-mapster-\u4f7f\u7528",children:[{value:"12.3.1 \u6781\u6613\u5165\u95e8",id:"1231-\u6781\u6613\u5165\u95e8",children:[]},{value:"12.3.2 \u81ea\u5b9a\u4e49\u6620\u5c04\u89c4\u5219",id:"1232-\u81ea\u5b9a\u4e49\u6620\u5c04\u89c4\u5219",children:[]},{value:"12.3.3 \u4f9d\u8d56\u6ce8\u5165\u65b9\u5f0f",id:"1233-\u4f9d\u8d56\u6ce8\u5165\u65b9\u5f0f",children:[]},{value:"12.3.4 \u548c EFCore \u914d\u5408",id:"1234-\u548c-efcore-\u914d\u5408",children:[]}]},{value:"12.4 \u53cd\u9988\u4e0e\u5efa\u8bae",id:"124-\u53cd\u9988\u4e0e\u5efa\u8bae",children:[]}],b={rightToc:o};function s(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(c.b)("wrapper",Object(a.a)({},b,n,{components:t,mdxType:"MDXLayout"}),Object(c.b)("h2",{id:"121-\u5bf9\u8c61\u6620\u5c04"},"12.1 \u5bf9\u8c61\u6620\u5c04"),Object(c.b)("p",null,"\u7b80\u5355\u6765\u8bf4\uff0c\u5c31\u662f\u5c06\u4e00\u4e2a\u5bf9\u8c61\u7684\u6570\u636e\u6839\u636e\u7279\u5b9a\u89c4\u5219\u6279\u91cf\u6620\u5c04\u5230\u53e6\u4e00\u4e2a\u5bf9\u8c61\u4e2d\uff0c\u51cf\u5c11\u624b\u5de5\u64cd\u4f5c\u548c\u964d\u4f4e\u4eba\u4e3a\u51fa\u9519\u7387\u3002\u5982\u5c06 ",Object(c.b)("inlineCode",{parentName:"p"},"DTO")," \u5bf9\u8c61\u6620\u5c04\u5230 ",Object(c.b)("inlineCode",{parentName:"p"},"Entity")," \u5b9e\u4f53\u4e2d\uff0c\u53cd\u4e4b\u4ea6\u7136\u3002"),Object(c.b)("h2",{id:"122-\u5148\u770b\u4f8b\u5b50"},"12.2 \u5148\u770b\u4f8b\u5b50"),Object(c.b)("p",null,"\u5728\u8fc7\u53bb\uff0c\u6211\u4eec\u9700\u8981\u5c06\u4e00\u4e2a\u5bf9\u8c61\u7684\u503c\u8f6c\u6362\u5230\u53e6\u4e00\u4e2a\u5bf9\u8c61\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u8fd9\u6837\u505a\uff0c\u5982\uff1a"),Object(c.b)("pre",null,Object(c.b)("code",Object(a.a)({parentName:"pre"},{className:"language-cs"}),'var entity = repository.Find(1);\n\nvar dto = new Dto();\ndto.Id = entity.Id;\ndto.Name = entity.Name;\ndto.Age = entity.Age;\ndto.Address = entity.Address;\ndto.FullName = entity.FirstName + entity.LastName;\ndto.IdCard = entity.IdCard.Replace("1234", "****");\n')),Object(c.b)("p",null,"\u4e0a\u9762\u7684\u4f8b\u5b50\u4f3c\u4e4e\u6ca1\u6709\u4efb\u4f55\u95ee\u9898\uff0c\u4f46\u662f\u5982\u679c\u5f88\u591a\u5730\u65b9\u9700\u8981\u8fd9\u6837\u7684\u8d4b\u503c\u64cd\u4f5c\u3001\u6216\u8005\u76f8\u540c\u7684\u8d4b\u503c\u64cd\u4f5c\u5728\u591a\u4e2a\u5730\u65b9\u4f7f\u7528\uff0c\u53c8\u6216\u8005\u4e00\u4e2a\u7c7b\u4e2d\u542b\u6709\u975e\u5e38\u591a\u7684\u5c5e\u6027\u6216\u81ea\u5b9a\u4e49\u8d4b\u503c\u64cd\u4f5c\u3002\u90a3\u4e48\u8fd9\u6837\u7684\u64cd\u4f5c\u6548\u7387\u6781\u4f4e\uff0c\u5bb9\u6613\u51fa\u9519\uff0c\u4e14\u4ee3\u7801\u975e\u5e38\u81c3\u80bf\u548c\u5197\u4f59\u3002"),Object(c.b)("p",null,"\u6240\u4ee5\uff0c\u5b9e\u73b0\u81ea\u52a8\u6620\u5c04\u8d4b\u503c\u548c\u652f\u6301\u7279\u6b8a\u914d\u7f6e\u7684\u9700\u6c42\u5c31\u6709\u4e86\u3002\u76ee\u524d ",Object(c.b)("inlineCode",{parentName:"p"},"C#")," \u5e73\u53f0\u6709\u4e24\u4e2a\u4f18\u79c0\u7684\u5bf9\u8c61\u6620\u5c04\u5de5\u5177\uff1a",Object(c.b)("inlineCode",{parentName:"p"},"Mapster")," \u548c ",Object(c.b)("inlineCode",{parentName:"p"},"AutoMapper"),"\u3002",Object(c.b)("strong",{parentName:"p"},"\u5728 ",Object(c.b)("inlineCode",{parentName:"strong"},"Fur")," \u6846\u67b6\u4e2d\uff0c\u9ed8\u8ba4\u96c6\u6210\u7684\u662f ",Object(c.b)("a",Object(a.a)({parentName:"strong"},{href:"https://github.com/MapsterMapper/Mapster"}),"Mapster"),"\uff0c",Object(c.b)("a",Object(a.a)({parentName:"strong"},{href:"https://github.com/MapsterMapper/Mapster"}),"Mapster")," \u662f\u4e00\u6b3e\u6781\u6613\u4f7f\u7528\u4e14\u8d85\u9ad8\u6027\u80fd\u7684\u5bf9\u8c61\u6620\u5c04\u6846\u67b6\u3002")),Object(c.b)("h2",{id:"123-mapster-\u4f7f\u7528"},"12.3 ",Object(c.b)("inlineCode",{parentName:"h2"},"Mapster")," \u4f7f\u7528"),Object(c.b)("p",null,"\u73b0\u5728\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7 ",Object(c.b)("inlineCode",{parentName:"p"},"Mapster")," \u63d0\u4f9b\u7684\u5bf9\u8c61\u6620\u5c04\u65b9\u6cd5\uff1a",Object(c.b)("inlineCode",{parentName:"p"},"Adapt")," \u65b9\u6cd5\u6539\u9020\u4e0a\u9762\u7684\u4f8b\u5b50\uff1a"),Object(c.b)("h3",{id:"1231-\u6781\u6613\u5165\u95e8"},"12.3.1 \u6781\u6613\u5165\u95e8"),Object(c.b)("pre",null,Object(c.b)("code",Object(a.a)({parentName:"pre"},{className:"language-cs"}),"var entity = repository.Find(1);\nvar dto = entity.Adapt();\n")),Object(c.b)("p",null,"\u4ec5\u4ec5\u4e00\u884c\u4ee3\u7801\u5c31\u53ef\u4ee5\u5b9e\u73b0 ",Object(c.b)("inlineCode",{parentName:"p"},"entity -> dto")," \u7684\u8f6c\u6362\uff0c\u5982\u679c\u6d89\u53ca\u5230\u8d4b\u503c\u7684\u590d\u5236\u64cd\u4f5c\uff0c\u5982 ",Object(c.b)("inlineCode",{parentName:"p"},"dto.FullName")," \u548c ",Object(c.b)("inlineCode",{parentName:"p"},"dto.IdCard"),"\uff0c\u6211\u4eec\u53ea\u9700\u8981\u81ea\u5b9a\u4e49\u6620\u5c04\u89c4\u5219\u7c7b\u5373\u53ef\u3002"),Object(c.b)("h3",{id:"1232-\u81ea\u5b9a\u4e49\u6620\u5c04\u89c4\u5219"},"12.3.2 \u81ea\u5b9a\u4e49\u6620\u5c04\u89c4\u5219"),Object(c.b)("pre",null,Object(c.b)("code",Object(a.a)({parentName:"pre"},{className:"language-cs",metastring:"{1,7,11-13}","{1,7,11-13}":!0}),'using Fur.ObjectMapper;\nusing Mapster;\nusing System;\n\nnamespace Fur.Application\n{\n public class Mapper : IObjectMapper\n {\n public void Register(TypeAdapterConfig config)\n {\n config.ForType()\n .Map(dest => dest.FullName, src => src.FirstName + src.LastName)\n .Map(dest => dest.IdCard, src => src.IdCard.Replace("1234", "****"));\n }\n }\n}\n')),Object(c.b)("div",{className:"admonition admonition-tip alert alert--success"},Object(c.b)("div",Object(a.a)({parentName:"div"},{className:"admonition-heading"}),Object(c.b)("h5",{parentName:"div"},Object(c.b)("span",Object(a.a)({parentName:"h5"},{className:"admonition-icon"}),Object(c.b)("svg",Object(a.a)({parentName:"span"},{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"16",viewBox:"0 0 12 16"}),Object(c.b)("path",Object(a.a)({parentName:"svg"},{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})))),"\u5c0f\u77e5\u8bc6")),Object(c.b)("div",Object(a.a)({parentName:"div"},{className:"admonition-content"}),Object(c.b)("p",{parentName:"div"},"\u8be5\u6620\u5c04\u6587\u4ef6 ",Object(c.b)("inlineCode",{parentName:"p"},"Mapper.cs")," \u53ef\u4ee5\u653e\u5728\u4efb\u4f55\u9879\u76ee\u6216\u6587\u4ef6\u5939\u4e2d\uff0c",Object(c.b)("inlineCode",{parentName:"p"},"Fur")," \u4f1a\u5728\u7a0b\u5e8f\u542f\u52a8\u7684\u65f6\u5019\u81ea\u52a8\u626b\u63cf\u5e76\u6ce8\u5165\u914d\u7f6e\u3002"))),Object(c.b)("h3",{id:"1233-\u4f9d\u8d56\u6ce8\u5165\u65b9\u5f0f"},"12.3.3 \u4f9d\u8d56\u6ce8\u5165\u65b9\u5f0f"),Object(c.b)("p",null,Object(c.b)("inlineCode",{parentName:"p"},"Mapster")," \u9664\u4e86\u63d0\u4f9b ",Object(c.b)("inlineCode",{parentName:"p"},"Adapt")," \u62d3\u5c55\u65b9\u6cd5\u4ee5\u5916\uff0c\u540c\u65f6\u8fd8\u63d0\u4f9b\u4f9d\u8d56\u6ce8\u5165\u7684\u65b9\u5f0f\u3002"),Object(c.b)("pre",null,Object(c.b)("code",Object(a.a)({parentName:"pre"},{className:"language-cs"}),"public class Person(IMapper mapper)\n{\n var dto = _mapper.Map(entity);\n}\n")),Object(c.b)("h3",{id:"1234-\u548c-efcore-\u914d\u5408"},"12.3.4 \u548c ",Object(c.b)("inlineCode",{parentName:"h3"},"EFCore")," \u914d\u5408"),Object(c.b)("p",null,Object(c.b)("inlineCode",{parentName:"p"},"Mapster")," \u8fd8\u63d0\u4f9b\u4e86 ",Object(c.b)("inlineCode",{parentName:"p"},"ProjectToType")," Linq \u62d3\u5c55\u65b9\u6cd5\u51cf\u5c11\u6211\u4eec\u624b\u52a8 ",Object(c.b)("inlineCode",{parentName:"p"},"Select")," \u64cd\u4f5c\uff0c\u5982\uff1a"),Object(c.b)("p",null,"\u6b63\u5e38\u7684\u64cd\u4f5c\uff1a"),Object(c.b)("pre",null,Object(c.b)("code",Object(a.a)({parentName:"pre"},{className:"language-cs"}),"var destinations = context.Sources\n .Select(c => new Destination {\n Id = p.Id,\n Name = p.Name,\n Surname = p.Surname,\n ....\n })\n .ToList();\n")),Object(c.b)("p",null,"\u4f7f\u7528 ",Object(c.b)("inlineCode",{parentName:"p"},"Mapster")," \u4e4b\u540e\uff1a"),Object(c.b)("pre",null,Object(c.b)("code",Object(a.a)({parentName:"pre"},{className:"language-cs"})," var destinations = context.Sources.ProjectToType().ToList();\n")),Object(c.b)("h2",{id:"124-\u53cd\u9988\u4e0e\u5efa\u8bae"},"12.4 \u53cd\u9988\u4e0e\u5efa\u8bae"),Object(c.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(c.b)("div",Object(a.a)({parentName:"div"},{className:"admonition-heading"}),Object(c.b)("h5",{parentName:"div"},Object(c.b)("span",Object(a.a)({parentName:"h5"},{className:"admonition-icon"}),Object(c.b)("svg",Object(a.a)({parentName:"span"},{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"}),Object(c.b)("path",Object(a.a)({parentName:"svg"},{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})))),"\u4e0e\u6211\u4eec\u4ea4\u6d41")),Object(c.b)("div",Object(a.a)({parentName:"div"},{className:"admonition-content"}),Object(c.b)("p",{parentName:"div"},"\u7ed9 Fur \u63d0 ",Object(c.b)("a",Object(a.a)({parentName:"p"},{href:"https://gitee.com/monksoul/Fur/issues/new?issue"}),"Issue"),"\u3002"))),Object(c.b)("hr",null),Object(c.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(c.b)("div",Object(a.a)({parentName:"div"},{className:"admonition-heading"}),Object(c.b)("h5",{parentName:"div"},Object(c.b)("span",Object(a.a)({parentName:"h5"},{className:"admonition-icon"}),Object(c.b)("svg",Object(a.a)({parentName:"span"},{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"}),Object(c.b)("path",Object(a.a)({parentName:"svg"},{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})))),"\u4e86\u89e3\u66f4\u591a")),Object(c.b)("div",Object(a.a)({parentName:"div"},{className:"admonition-content"}),Object(c.b)("p",{parentName:"div"},"\u60f3\u4e86\u89e3\u66f4\u591a ",Object(c.b)("inlineCode",{parentName:"p"},"Mapster")," \u77e5\u8bc6\u53ef\u67e5\u9605 ",Object(c.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/MapsterMapper/Mapster/wiki"}),"Mapster - Wiki")," \u6587\u6863\u3002"))))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/docs/8bbf9761.517fd551.js b/docs/8bbf9761.517fd551.js new file mode 100644 index 00000000000..17e36a3a6b7 --- /dev/null +++ b/docs/8bbf9761.517fd551.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[44],{100:function(e,n,t){"use strict";t.r(n),t.d(n,"frontMatter",(function(){return o})),t.d(n,"metadata",(function(){return c})),t.d(n,"rightToc",(function(){return l})),t.d(n,"default",(function(){return u}));var r=t(2),a=t(6),i=(t(0),t(142)),o={id:"reference",title:"1.4 \u9879\u76ee\u5f15\u7528",sidebar_label:"1.4 \u9879\u76ee\u5f15\u7528"},c={unversionedId:"reference",id:"reference",isDocsHomePage:!1,title:"1.4 \u9879\u76ee\u5f15\u7528",description:"1.4.1 \u5173\u4e8e\u9879\u76ee\u5f15\u7528",source:"@site/docs\\reference.mdx",slug:"/reference",permalink:"/docs/reference",editUrl:"https://gitee.com/monksoul/Fur/tree/main/handbook/docs/reference.mdx",version:"current",sidebar_label:"1.4 \u9879\u76ee\u5f15\u7528",sidebar:"docs",previous:{title:"1.3 \u6e90\u7801\u7ed3\u6784",permalink:"/docs/source"},next:{title:"2. \u4e00\u5206\u949f\u5165\u95e8",permalink:"/docs/get-start"}},l=[{value:"1.4.1 \u5173\u4e8e\u9879\u76ee\u5f15\u7528",id:"141-\u5173\u4e8e\u9879\u76ee\u5f15\u7528",children:[]},{value:"1.4.2 \u96c6\u6210 Fur \u529f\u80fd",id:"142-\u96c6\u6210-fur-\u529f\u80fd",children:[]},{value:"1.4.3 \u53cd\u9988\u4e0e\u5efa\u8bae",id:"143-\u53cd\u9988\u4e0e\u5efa\u8bae",children:[]}],b={rightToc:l};function u(e){var n=e.components,t=Object(a.a)(e,["components"]);return Object(i.b)("wrapper",Object(r.a)({},b,t,{components:n,mdxType:"MDXLayout"}),Object(i.b)("h2",{id:"141-\u5173\u4e8e\u9879\u76ee\u5f15\u7528"},"1.4.1 \u5173\u4e8e\u9879\u76ee\u5f15\u7528"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"Fur")," \u6846\u67b6\u9ed8\u8ba4\u91c7\u7528\u591a\u5c42\u9879\u76ee\u8bbe\u8ba1\u67b6\u6784\uff0c\u6bcf\u4e00\u4e2a\u9879\u76ee\u5c42\u7684\u4f9d\u8d56\u5206\u522b\u662f\uff1a"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},Object(i.b)("inlineCode",{parentName:"li"},"Fur"),"\uff1a\u6838\u5fc3\u5c42\uff0c\u65e0\u9879\u76ee\u4f9d\u8d56"),Object(i.b)("li",{parentName:"ul"},Object(i.b)("inlineCode",{parentName:"li"},"Fur.Application"),"\uff1a\u6dfb\u52a0 ",Object(i.b)("inlineCode",{parentName:"li"},"Fur.Core")," \u5f15\u7528"),Object(i.b)("li",{parentName:"ul"},Object(i.b)("inlineCode",{parentName:"li"},"Fur.Core"),"\uff1a\u6dfb\u52a0 ",Object(i.b)("inlineCode",{parentName:"li"},"Fur")," \u5f15\u7528"),Object(i.b)("li",{parentName:"ul"},Object(i.b)("inlineCode",{parentName:"li"},"Fur.Database.Migrations"),"\uff1a\u6dfb\u52a0 ",Object(i.b)("inlineCode",{parentName:"li"},"Fur.EntityFramework.Core")," \u5f15\u7528"),Object(i.b)("li",{parentName:"ul"},Object(i.b)("inlineCode",{parentName:"li"},"Fur.EntityFramework.Core"),"\uff1a\u6dfb\u52a0 ",Object(i.b)("inlineCode",{parentName:"li"},"Fur.Core")," \u5f15\u7528"),Object(i.b)("li",{parentName:"ul"},Object(i.b)("inlineCode",{parentName:"li"},"Fur.Web.Core"),"\uff1a\u6dfb\u52a0 ",Object(i.b)("inlineCode",{parentName:"li"},"Fur.Application"),"\uff0c",Object(i.b)("inlineCode",{parentName:"li"},"Fur.Database.Migrations")," \u5f15\u7528"),Object(i.b)("li",{parentName:"ul"},Object(i.b)("inlineCode",{parentName:"li"},"Fur.Web.Entry"),"\uff1a\u6dfb\u52a0 ",Object(i.b)("inlineCode",{parentName:"li"},"Fur.Web.Core")," \u5f15\u7528 \u548c ",Object(i.b)("inlineCode",{parentName:"li"},"Microsoft.EntityFrameworkCore.Tools")," \u5305")),Object(i.b)("p",null,"\u5982\u679c\u5f00\u53d1\u8005\u642d\u5efa\u81ea\u5df1\u7684\u9879\u76ee\uff0c\u5219\u53ea\u9700\u8981\u5728 ",Object(i.b)("inlineCode",{parentName:"p"},"Fur.Core")," \u5c42\u5f15\u7528 ",Object(i.b)("inlineCode",{parentName:"p"},"Nuget")," \u4e2d\u6700\u65b0\u7684 ",Object(i.b)("inlineCode",{parentName:"p"},"Fur")," \u5305\u5373\u53ef\u3002"),Object(i.b)("h2",{id:"142-\u96c6\u6210-fur-\u529f\u80fd"},"1.4.2 \u96c6\u6210 ",Object(i.b)("inlineCode",{parentName:"h2"},"Fur")," \u529f\u80fd"),Object(i.b)("p",null,"\u9879\u76ee\u642d\u5efa\u597d\u4e4b\u540e\uff0c\u96c6\u6210 ",Object(i.b)("inlineCode",{parentName:"p"},"Fur")," \u6846\u67b6\u53ea\u9700\u8981\u5728 ",Object(i.b)("inlineCode",{parentName:"p"},"Program.cs")," \u4e2d \u6dfb\u52a0 ",Object(i.b)("inlineCode",{parentName:"p"},"Inject()")," \u65b9\u6cd5\u5373\u53ef\uff1a"),Object(i.b)("pre",null,Object(i.b)("code",Object(r.a)({parentName:"pre"},{className:"language-cs",metastring:"{18}","{18}":!0}),"using Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Hosting;\n\nnamespace Fur.Web.Entry\n{\n public class Program\n {\n public static void Main(string[] args)\n {\n CreateHostBuilder(args).Build().Run();\n }\n\n public static IHostBuilder CreateHostBuilder(string[] args)\n {\n return Host.CreateDefaultBuilder(args)\n .ConfigureWebHostDefaults(webBuilder =>\n {\n webBuilder.Inject()\n .UseStartup();\n });\n }\n }\n}\n")),Object(i.b)("h2",{id:"143-\u53cd\u9988\u4e0e\u5efa\u8bae"},"1.4.3 \u53cd\u9988\u4e0e\u5efa\u8bae"),Object(i.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(i.b)("div",Object(r.a)({parentName:"div"},{className:"admonition-heading"}),Object(i.b)("h5",{parentName:"div"},Object(i.b)("span",Object(r.a)({parentName:"h5"},{className:"admonition-icon"}),Object(i.b)("svg",Object(r.a)({parentName:"span"},{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"}),Object(i.b)("path",Object(r.a)({parentName:"svg"},{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})))),"\u4e0e\u6211\u4eec\u4ea4\u6d41")),Object(i.b)("div",Object(r.a)({parentName:"div"},{className:"admonition-content"}),Object(i.b)("p",{parentName:"div"},"\u7ed9 Fur \u63d0 ",Object(i.b)("a",Object(r.a)({parentName:"p"},{href:"https://gitee.com/monksoul/Fur/issues/new?issue"}),"Issue"),"\u3002"))))}u.isMDXComponent=!0},142:function(e,n,t){"use strict";t.d(n,"a",(function(){return p})),t.d(n,"b",(function(){return m}));var r=t(0),a=t.n(r);function i(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function c(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var b=a.a.createContext({}),u=function(e){var n=a.a.useContext(b),t=n;return e&&(t="function"==typeof e?e(n):c(c({},n),e)),t},p=function(e){var n=u(e.components);return a.a.createElement(b.Provider,{value:n},e.children)},s={inlineCode:"code",wrapper:function(e){var n=e.children;return a.a.createElement(a.a.Fragment,{},n)}},d=a.a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,i=e.originalType,o=e.parentName,b=l(e,["components","mdxType","originalType","parentName"]),p=u(t),d=r,m=p["".concat(o,".").concat(d)]||p[d]||s[d]||i;return t?a.a.createElement(m,c(c({ref:n},b),{},{components:t})):a.a.createElement(m,c({ref:n},b))}));function m(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var i=t.length,o=new Array(i);o[0]=d;var c={};for(var l in n)hasOwnProperty.call(n,l)&&(c[l]=n[l]);c.originalType=e,c.mdxType="string"==typeof e?e:r,o[1]=c;for(var b=2;b\n \n\n')),Object(o.b)("p",null,"\u5b8c\u6574\u4ee3\u7801\u5982\u4e0b\uff1a"),Object(o.b)("pre",null,Object(o.b)("code",Object(r.a)({parentName:"pre"},{className:"language-xml",metastring:"{17-19}","{17-19}":!0}),'\n\n \n net5.0\n 1701;1702;1591\n Fur.Core.xml\n \n\n \n \n \n\n \n \n \n\n \n \n \n\n\n\n')),Object(o.b)("p",null,"\u6240\u6709\u65b0\u5efa\u9879\u76ee\u90fd\u9700\u6dfb\u52a0 ",Object(o.b)("inlineCode",{parentName:"p"},"\u4e0a\u8ff0\u9ad8\u4eae\u4ee3\u7801"),"\uff0c\u65b9\u53ef\u4f7f\u7528 ",Object(o.b)("inlineCode",{parentName:"p"},"Fur")," \u5168\u90e8\u529f\u80fd\u3002"),Object(o.b)("h2",{id:"143-\u53cd\u9988\u4e0e\u5efa\u8bae"},"1.4.3 \u53cd\u9988\u4e0e\u5efa\u8bae"),Object(o.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(o.b)("div",Object(r.a)({parentName:"div"},{className:"admonition-heading"}),Object(o.b)("h5",{parentName:"div"},Object(o.b)("span",Object(r.a)({parentName:"h5"},{className:"admonition-icon"}),Object(o.b)("svg",Object(r.a)({parentName:"span"},{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"}),Object(o.b)("path",Object(r.a)({parentName:"svg"},{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})))),"\u4e0e\u6211\u4eec\u4ea4\u6d41")),Object(o.b)("div",Object(r.a)({parentName:"div"},{className:"admonition-content"}),Object(o.b)("p",{parentName:"div"},"\u7ed9 Fur \u63d0 ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://gitee.com/monksoul/Fur/issues/new?issue"}),"Issue"),"\u3002"))))}p.isMDXComponent=!0},142:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return d}));var r=n(0),a=n.n(r);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function c(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var b=a.a.createContext({}),p=function(e){var t=a.a.useContext(b),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=p(e.components);return a.a.createElement(b.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},s=a.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,i=e.parentName,b=l(e,["components","mdxType","originalType","parentName"]),u=p(n),s=r,d=u["".concat(i,".").concat(s)]||u[s]||m[s]||o;return n?a.a.createElement(d,c(c({ref:t},b),{},{components:n})):a.a.createElement(d,c({ref:t},b))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=s;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var b=2;b Blog | Fur - + - +
-

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

+

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

- + - + \ No newline at end of file diff --git a/docs/blog/tags/fur/index.html b/docs/blog/tags/fur/index.html index 39e777f3fd6..ca8a2be03b8 100644 --- a/docs/blog/tags/fur/index.html +++ b/docs/blog/tags/fur/index.html @@ -6,26 +6,26 @@ Posts tagged "fur" | Fur - + - +
-

1 post tagged with "fur"

View All Tags

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

+

1 post tagged with "fur"

View All Tags

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

- + - + \ No newline at end of file diff --git a/docs/blog/tags/furos/index.html b/docs/blog/tags/furos/index.html index dbbf384ada9..74a0a68e294 100644 --- a/docs/blog/tags/furos/index.html +++ b/docs/blog/tags/furos/index.html @@ -6,26 +6,26 @@ Posts tagged "furos" | Fur - + - +
-

1 post tagged with "furos"

View All Tags

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

+

1 post tagged with "furos"

View All Tags

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

- + - + \ No newline at end of file diff --git a/docs/blog/tags/index.html b/docs/blog/tags/index.html index cb39023bc97..535ad68ecb0 100644 --- a/docs/blog/tags/index.html +++ b/docs/blog/tags/index.html @@ -6,7 +6,7 @@ Tags | Fur - + @@ -17,7 +17,7 @@ - + diff --git a/docs/blog/tags/net-5/index.html b/docs/blog/tags/net-5/index.html index a0b17c7d0a5..9e85b5e6261 100644 --- a/docs/blog/tags/net-5/index.html +++ b/docs/blog/tags/net-5/index.html @@ -6,26 +6,26 @@ Posts tagged ".net5" | Fur - + - +
-

1 post tagged with ".net5"

View All Tags

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

+

1 post tagged with ".net5"

View All Tags

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

- + - + \ No newline at end of file diff --git a/docs/blog/tags/net/index.html b/docs/blog/tags/net/index.html index bfa678c92df..33e898ed0fb 100644 --- a/docs/blog/tags/net/index.html +++ b/docs/blog/tags/net/index.html @@ -6,26 +6,26 @@ Posts tagged ".net" | Fur - + - +
-

1 post tagged with ".net"

View All Tags

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

+

1 post tagged with ".net"

View All Tags

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

- + - + \ No newline at end of file diff --git a/docs/blog/tags/netcore/index.html b/docs/blog/tags/netcore/index.html index 959db2ca8db..9a554f0d582 100644 --- a/docs/blog/tags/netcore/index.html +++ b/docs/blog/tags/netcore/index.html @@ -6,26 +6,26 @@ Posts tagged ".netcore" | Fur - + - +
-

1 post tagged with ".netcore"

View All Tags

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

+

1 post tagged with ".netcore"

View All Tags

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

- + - + \ No newline at end of file diff --git a/docs/blog/welcome/index.html b/docs/blog/welcome/index.html index 2a4400f7602..6adf6ed8d89 100644 --- a/docs/blog/welcome/index.html +++ b/docs/blog/welcome/index.html @@ -6,24 +6,24 @@ Fur 介绍 | Fur - + - +
-

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

🌭 开源地址

🍿 Docker 镜像

  • Docker Hub 线上镜像
docker run --name fur -p 5000:80 monksoul/fur:v1.0.0-2020.10.14
  • 手动 打包镜像

打开 CMD/Shell/PowerShell 进入 Fur 项目根目录打包 Fur 镜像:

docker build -t fur:v1.0.0-2020.10.14 .

打包成功后,直接 docker run

docker run --name fur -p 5000:80 fur:v1.0.0-2020.10.14

🥞 架构设计

正在整理中...

🥝 功能模块

🥐 框架依赖

Fur 为了追求极速入门,极致性能,尽可能的不使用或减少第三方依赖。目前 Fur 仅集成了以下三个依赖:

麻雀虽小五脏俱全。Fur 即使只集成了这三个依赖,但是主流的 依赖注入/控制反转AOP 面向切面编程,事件总线数据验证数据库操作 等等一个都不少。

🥗 环境要求

  • Visual Studio 2019 Preview 16.8 +
  • .NET 5 SDK +
  • .Net Standard 2.1 +

🥪 支持平台

  • 运行环境
    • Windows
    • Linux
    • MacOS
    • Docker/K8S/K3S/Rancher
    • Xamarin/MAUI
  • 数据库
    • SqlServer
    • Sqlite
    • Azure Cosmos
    • MySql
    • PostgreSQL
    • InMemoryDatabase
    • Oracle
    • Firebird
    • 达梦数据库
  • 应用部署
    • Kestrel
    • Nginx
    • Jexus
    • IIS
    • Apache
    • PM2
    • Supervisor
    • 单文件
    • 容器(Docker/K8S/K3S/Rancher)

🍖 关于性能

Fur 目前采用 Visual Studio 2019 Preview 16.8 自带性能测试和 JMeter 进行测试,由于篇幅有限,只贴部分测试图,测试结果如下:


🍚 关于作者

一个拥有 12 年开发经验 .NETer。喜欢分享,喜欢新技术,在互联网多个技术领域皆有涉猎。

🍤 项目成员

🎈 欢迎更多的开发者加入 Fur 大家庭。

🍝 他们都在用

  • 百签科技(广东)有限公司
  • 码为科技(广州)有限公司
  • 广州启顺国际货运代理有限公司
  • 森丰供应链服务(广州)有限公司
  • 中山赢友网络科技有限公司
  • 中山模思软件科技有限公司
  • 珠海市恒泰新软件有限责任公司
  • 珠海思诺锐创软件有限公司
  • 深圳市易胜科技有限公司
  • 重庆虫儿飞科技有限公司
  • 重庆林木森科技有限公司
  • 深圳市品立方科技有限公司

如果您的项目使用到 Fur 开发,可以告诉我们。

🍻 贡献代码

Fur 遵循 Apache-2.0 开源协议,欢迎大家提交 PRIssue

如果要为项目做出贡献,请查看贡献指南。

🍍 捐赠列表

注:排序按捐赠顺序书写

捐赠人昵称捐赠金额(元)附语
🤴 爱吃油麦菜100感谢您的开源项目!
👳‍♂️ 麦壳饼200感谢您的开源项目!
👨 Sun100感谢您的开源项目!
👶 d61761720感谢您的开源项目!
👦 Diqiguoji00816.66见贤思齐
👲 nodyang100感谢您的开源项目!
👳‍♀️ mictxd100吹过的牛都实现。
🧓 欧流全10希望将来超越 Spring
👨‍⚕️ lionkon10...看了框架感觉拿来学习是很不错的...
😤 好人!10...Nice 的小僧,我们的 dotnetchina 马上火起来了...
😮 木木 Woody10感谢您的开源项目!

非常感谢您们的支持,正是因为您们,中国开源才可以越走越远,Fur 越走越远。

🥔 QQ 交流群

🧆 友情链接

👉 Fur 👉 SqlSugar 👉 Layx 👉 t-io 👉 ThinkPHP 👉 Hutool 👉 BootstrapAdmin 👉 BootstrapBlazor

+

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

🌭 开源地址

🍿 Docker 镜像

  • Docker Hub 线上镜像
docker run --name fur -p 5000:80 monksoul/fur:v1.0.0-rc.final
  • 手动 打包镜像

打开 CMD/Shell/PowerShell 进入 Fur 项目根目录打包 Fur 镜像:

docker build -t fur:v1.0.0-rc.final .

打包成功后,直接 docker run

docker run --name fur -p 5000:80 fur:v1.0.0-rc.final

🥞 架构设计

正在整理中...

🥝 功能模块

🥐 框架依赖

Fur 为了追求极速入门,极致性能,尽可能的不使用或减少第三方依赖。目前 Fur 仅集成了以下三个依赖:

麻雀虽小五脏俱全。Fur 即使只集成了这三个依赖,但是主流的 依赖注入/控制反转AOP 面向切面编程,事件总线数据验证数据库操作 等等一个都不少。

🥗 环境要求

  • Visual Studio 2019 Preview 16.8 +
  • .NET 5 SDK +
  • .Net Standard 2.1 +

🥪 支持平台

  • 运行环境
    • Windows
    • Linux
    • MacOS
    • Docker/K8S/K3S/Rancher
    • Xamarin/MAUI
  • 数据库
    • SqlServer
    • Sqlite
    • Azure Cosmos
    • MySql
    • PostgreSQL
    • InMemoryDatabase
    • Oracle
    • Firebird
    • 达梦数据库
  • 应用部署
    • Kestrel
    • Nginx
    • Jexus
    • IIS
    • Apache
    • PM2
    • Supervisor
    • 单文件
    • 容器(Docker/K8S/K3S/Rancher)

🍖 关于性能

Fur 目前采用 Visual Studio 2019 Preview 16.8 自带性能测试和 JMeter 进行测试,由于篇幅有限,只贴部分测试图,测试结果如下:


🍚 关于作者

一个拥有 12 年开发经验 .NETer。喜欢分享,喜欢新技术,在互联网多个技术领域皆有涉猎。

🍤 项目成员

🎈 欢迎更多的开发者加入 Fur 大家庭。

🍝 他们都在用

  • 百签科技(广东)有限公司
  • 码为科技(广州)有限公司
  • 广州启顺国际货运代理有限公司
  • 森丰供应链服务(广州)有限公司
  • 中山赢友网络科技有限公司
  • 中山模思软件科技有限公司
  • 珠海市恒泰新软件有限责任公司
  • 珠海思诺锐创软件有限公司
  • 深圳市易胜科技有限公司
  • 重庆虫儿飞科技有限公司
  • 重庆林木森科技有限公司
  • 深圳市品立方科技有限公司

如果您的项目使用到 Fur 开发,可以告诉我们。

🍻 贡献代码

Fur 遵循 Apache-2.0 开源协议,欢迎大家提交 PRIssue

如果要为项目做出贡献,请查看贡献指南。

🍍 捐赠列表

注:排序按捐赠顺序书写

捐赠人昵称捐赠金额(元)附语
🤴 爱吃油麦菜100感谢您的开源项目!
👳‍♂️ 麦壳饼200感谢您的开源项目!
👨 Sun100感谢您的开源项目!
👶 d61761720感谢您的开源项目!
👦 Diqiguoji00816.66见贤思齐
👲 nodyang100感谢您的开源项目!
👳‍♀️ mictxd100吹过的牛都实现。
🧓 欧流全10希望将来超越 Spring
👨‍⚕️ lionkon10...看了框架感觉拿来学习是很不错的...
😤 好人!10...Nice 的小僧,我们的 dotnetchina 马上火起来了...
😮 木木 Woody10感谢您的开源项目!

非常感谢您们的支持,正是因为您们,中国开源才可以越走越远,Fur 越走越远。

🥔 QQ 交流群

🧆 友情链接

👉 Fur 👉 SqlSugar 👉 Layx 👉 t-io 👉 ThinkPHP 👉 Hutool 👉 BootstrapAdmin 👉 BootstrapBlazor

- + - + \ No newline at end of file diff --git a/docs/d3c206bc.5e7da086.js b/docs/d3c206bc.5e7da086.js deleted file mode 100644 index b78a8c7a977..00000000000 --- a/docs/d3c206bc.5e7da086.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[63],{117:function(e,t,r){"use strict";r.r(t),r.d(t,"frontMatter",(function(){return b})),r.d(t,"metadata",(function(){return i})),r.d(t,"rightToc",(function(){return p})),r.d(t,"default",(function(){return l}));var n=r(2),a=r(6),o=(r(0),r(142)),c=r(144),b={slug:"welcome",title:"Fur \u4ecb\u7ecd",author:"dotnet\u4e2d\u56fd",author_title:"\u4e3a\u4e2d\u56fd .NET \u5f00\u53d1\u8005\u63d0\u4f9b\u4f18\u8d28\u7684\u8d44\u8baf\u548c\u6280\u672f\u5206\u4eab\u3002",author_url:"https://chinadot.net",author_image_url:"https://i.loli.net/2020/10/01/94AxjHp21aPKQWd.png",tags:["fur","furos",".net",".netcore",".net5"]},i={permalink:"/blog/welcome",editUrl:"https://gitee.com/monksoul/Fur/tree/main/handbook/blog/2020-08-19-welcome.mdx",source:"@site/blog\\2020-08-19-welcome.mdx",description:"=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=a.a.createContext({}),u=function(e){var t=a.a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):b(b({},t),e)),r},l=function(e){var t=u(e.components);return a.a.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},m=a.a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),l=u(r),m=n,O=l["".concat(c,".").concat(m)]||l[m]||s[m]||o;return r?a.a.createElement(O,b(b({ref:t},p),{},{components:r})):a.a.createElement(O,b({ref:t},p))}));function O(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,c=new Array(o);c[0]=m;var b={};for(var i in t)hasOwnProperty.call(t,i)&&(b[i]=t[i]);b.originalType=e,b.mdxType="string"==typeof e?e:n,c[1]=b;for(var p=2;p=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var p=a.a.createContext({}),u=function(e){var t=a.a.useContext(p),r=t;return e&&(r="function"==typeof e?e(t):b(b({},t),e)),r},l=function(e){var t=u(e.components);return a.a.createElement(p.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},m=a.a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),l=u(r),m=n,O=l["".concat(c,".").concat(m)]||l[m]||s[m]||o;return r?a.a.createElement(O,b(b({ref:t},p),{},{components:r})):a.a.createElement(O,b({ref:t},p))}));function O(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,c=new Array(o);c[0]=m;var b={};for(var i in t)hasOwnProperty.call(t,i)&&(b[i]=t[i]);b.originalType=e,b.mdxType="string"==typeof e?e:n,c[1]=b;for(var p=2;p 29.1 常见问题 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/docs/docs/appstartup/index.html b/docs/docs/appstartup/index.html index 5f3d6bdfdc3..b9828970dbd 100644 --- a/docs/docs/appstartup/index.html +++ b/docs/docs/appstartup/index.html @@ -6,7 +6,7 @@ 3. 应用启动 | Fur - + @@ -48,7 +48,7 @@
namespace Fur.Web.Entry
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
}
}
}
Startup.cs 代码迁移

只需要将 ConfigureServicesConfigure 方法代码迁移到 FurWebCoreStartup.cs 中即可,而 Startup.cs 中两个方法留空即可。

非常简单吧。我们后续创建任何 MVCRazorPagesBlazor 项目只需要添加 Fur.Web.Core 引用和调用 Inject() 即可。

3.7 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/auth-control/index.html b/docs/docs/auth-control/index.html index 6060178485b..fc21baded58 100644 --- a/docs/docs/auth-control/index.html +++ b/docs/docs/auth-control/index.html @@ -6,7 +6,7 @@ 14. 安全鉴权 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/docs/docs/author/index.html b/docs/docs/author/index.html index 8f9e0f290f1..6cfdcee4c84 100644 --- a/docs/docs/author/index.html +++ b/docs/docs/author/index.html @@ -6,7 +6,7 @@ 1.2 关于作者 | Fur - + @@ -21,7 +21,7 @@

1.2 关于作者

互联网账号

  • 百小僧
  • Monk/MonkSoul

技术能力

自 2008 年 接触 IT 这个行业也有十余年了,在 后端(.NET/.NET Core/Java/PHP)、移动端(Xamarin/小程序/Java/Objective-C)、桌面端(WinForm/WPF/Electron)、前端(React/Vue/Angular/Node)等主流领域略知一二。

同时在技术培训领域也多有涉足。

职业情况

目前经营一家自己创办的软件科技公司,主要销售自主研发的 ERP 产品。

吃不起饭的时候也会接外包项目。

兴趣爱好

是个吃货,喜欢看抖音,看动漫,看美剧,看博客园、看开源中国。

对新技术颇感兴趣,喜欢开源事业,喜欢分享技术。

个人主页

https://gitee.com/monksoul

https://github.com/monksoul

- + diff --git a/docs/docs/cache/index.html b/docs/docs/cache/index.html index 9c70402c87f..5ee635c07b5 100644 --- a/docs/docs/cache/index.html +++ b/docs/docs/cache/index.html @@ -6,7 +6,7 @@ 13. 分布式缓存 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/docs/docs/configuration/index.html b/docs/docs/configuration/index.html index ce432912f15..b7e106d8014 100644 --- a/docs/docs/configuration/index.html +++ b/docs/docs/configuration/index.html @@ -6,7 +6,7 @@ 4.1 配置 | Fur - + @@ -22,7 +22,7 @@

4.1 配置

温馨提示

推荐使用 《4.2 选项》代替本章节功能。(为什么)?

4.1.1 什么是配置

简单来说,配置将系统应用可动态调配的选项放在统一地方管理,通过不同的配置让系统做出动态调整。

ASP.NET Core 应用程序启动时默认加载 启动项目 下的 appsettings.json 作为应用配置。同时还支持不同的运行环境加载对应的配置文件,如:

  • Development:加载 appsettings.Development.json
  • Staging:加载 appsettings.Staging.json
  • {Environment}appsettings.{Environment}.json

4.1.2 配置的使用

假设我们需要在系统运行时获取系统名称、版本号及版权信息,这些信息可能随时变化而且需要在多个地方使用。这时就需要将这些信息配置起来。具体步骤如下:

4.1.2.1 配置 appsettings.json 信息

{
"AppInfo": {
"Name": "Fur",
"Version": "1.0.0",
"Company": "Baiqian"
}
}

4.1.2.2 读取 appsettings.json 信息

Fur 框架中,提供了两种读取方式:

  • 依赖注入 IConfiguration 对象读取
  • 通过 App.Configuration[jsonKey] 读取
using Microsoft.AspNetCore.Mvc;
namespace Fur.Web.Entry.Controllers
{
[Route("api/[controller]")]
public class DefaultController : ControllerBase
{
[HttpGet]
public string Get()
{
return $@"名称:{App.Configuration["AppInfo:Name"]},
版本:{App.Configuration["AppInfo:Version"]},
公司:{App.Configuration["AppInfo:Company"]}";
}
}
}
依赖注入的方式

通过依赖注入注入实例有几种方式:

  • 构造函数注入方式
private readonly IConfiguration _configuration;
public DefaultController(IConfiguration configuration)
{
_configuration = configuration;
}
  • 参数注入方式 [FromServices]
public string Get([FromServices] IConfiguration configuration)
{
}
  • 属性注入方式
public IConfiguration Configuration { get; set; }

想了解更多关于《ASP.NET Core - 依赖注入》 知识

4.1.2.3 如何选择读取方式

  • 在可依赖注入类中,依赖注入 IConfiguration 读取
  • 在静态类/非依赖注入类中,选择 App.Configuration[jsonKey] 读取

4.1.3 路径符 查找节点

ASP.NET Core 中,配置采用 : 分隔符来读取分层配置数据。如上述例子中的 AppInfo:Name。如有更多层级数据则只需要通过 : 进入下一层节点即可。

假设我们有以下配置信息:

{
"AppInfo": {
"Name": "Fur",
"Version": "1.0.0",
"Company": {
"Name": "Baiqian",
"Address": {
"City": "中国",
"Province": "广东省",
"Detail": "中山市东区紫马公园西门"
}
}
}
}
var companyName = App.Configuration["AppInfo:Name"]; // => Fur

4.1.4 自定义配置文件

大多情况下,我们的配置只需要在 appsettings.json 中配置即可,但一些特殊情况下,我们希望某些组件或功能拥有独立的配置,这个时候就需要用到自定义配置,Fur 目前支持 .json.xml 两种方式配置,如:

Fur.Web.Entry/emailsetting.json
{
"outlook": {
"smtp": {
"server": "smtp.office365.com",
"port": "587",
"ssl": "STARTTLS"
},
"pop": {
"server": "outlook.office365.com",
"port": "995",
"ssl": "TLS"
}
}
}
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<MyKey>MyXMLFile Value</MyKey>
<Position>
<Title>Title from MyXMLFile</Title>
<Name>Name from MyXMLFile</Name>
</Position>
<Logging>
<LogLevel>
<Default>Information</Default>
<Microsoft>Warning</Microsoft>
</LogLevel>
</Logging>
</configuration>
xml 配置事项

如果采用 xml 配置,那么文件名必须以 .config.xml 结尾(不区分大小写)。

同时 Fur 提供了非常灵活的方式支持自定义配置文件读取,如:

4.1.4.1 读取 emailsetting.json 配置

读取自定义配置文件和读取 appsettings.json 一致,系统会自动从多个配置文件中读取输入,如:

var smtpServer = App.Configuration["outlook:smtp:server"]; // => smtp.office365.com
特别说明

Fur 框架会在启动时自动扫描每一个项目层根目录下的 *.json*.xml 文件加入配置中。所以无需手工配置。

4.1.5 不同环境读取

在实际应用开发中,我们可能会根据不同的环境加载不同的配置文件,如 数据库连接字符串

这时我们只需要遵循特定命名规范 {name}.{Environment}.json 即可。如:

  • appsettings.Development.json
  • appsettings.Staging.json
  • appsettings.Production.json
  • emailsetting.Development.json
  • emailsetting.Staging.json
  • emailsetting.Production.json

这时,ASP.NET Core 会在应用启动时自动加载不同环境的配置文件。

4.1.6 配置更改通知(热更新

.NET Core 应用程序中,配置支持更改通知,也就是热更新操作。一旦监听到 appsetting.json 或自定义配置文件发生变动,就会触发 OnChange 方法。代码如下:

var appInfoConfiguration = App.Configuration["AppInfo"];
ChangeToken.OnChange(() => appInfoConfiguration.GetReloadToken(), () =>
{
var name = appInfoConfiguration["Name"]; // 实时的最新值
var version = appInfoConfiguration["Version"]; // 实时的最新值
});

4.1.7 配置的优缺点

  • 优点

    • 能够在系统运行时快速读取
    • 无需额外配置
  • 缺点

    • 存在重复读取
    • 通过硬编码字符串读取,容易出错
    • 不能设置默认值
    • 不能在运行环境中动态配置
    • 不能验证配置有效性
    • 不支持更改通知

4.1.8 配置使用场景

如果只需要一次性读取配置信息,则使用配置,否则应该使用 《4.2 选项》代替。

4.1.9 反馈与建议

与我们交流

给 Fur 提 Issue


了解更多

想了解更多 配置 知识可查阅 ASP.NET Core - 配置 章节。

- + diff --git a/docs/docs/contribute/index.html b/docs/docs/contribute/index.html index f9a4670364f..d8864b4f80b 100644 --- a/docs/docs/contribute/index.html +++ b/docs/docs/contribute/index.html @@ -6,7 +6,7 @@ 28. 贡献指南 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/docs/docs/cors/index.html b/docs/docs/cors/index.html index dfced11f485..949156b485c 100644 --- a/docs/docs/cors/index.html +++ b/docs/docs/cors/index.html @@ -6,7 +6,7 @@ 15. CORS 跨域 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/docs/docs/data-validation/index.html b/docs/docs/data-validation/index.html index 62b524d149c..f80a3ca2bbc 100644 --- a/docs/docs/data-validation/index.html +++ b/docs/docs/data-validation/index.html @@ -6,7 +6,7 @@ 8. 数据校验 | Fur - + @@ -69,7 +69,7 @@
namespace Fur.Application
{
public class FurAppService : IDynamicApiController
{
[TypeFilter(typeof(DataValidationFilter))]
public TestDto Post(TestDto testDto)
{
return testDto;
}
}
}

8.9.4 [ApiController] 控制器范围验证

[ApiController]Mvc 提供的控制器范围(含所有动作方法)的验证。

using Microsoft.AspNetCore.Mvc;
namespace Fur.Web.Entry.Controllers
{
[ApiController]
public class MvcController : Controller
{
public IActionResult Index()
{
return View();
}
}
}

8.10 MiniProfiler 查看

如下图所示:

8.10 多语言支持

文档整理中...

8.11 验证模型提供器

文档整理中...

8.12 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/dbcontext-Interceptor/index.html b/docs/docs/dbcontext-Interceptor/index.html index 0566f697948..71fbd6517fb 100644 --- a/docs/docs/dbcontext-Interceptor/index.html +++ b/docs/docs/dbcontext-Interceptor/index.html @@ -6,7 +6,7 @@ 9.24 数据库操作拦截器 | Fur - + @@ -54,7 +54,7 @@
// 提交数据库失败
public override void SaveChangesFailed(DbContextErrorEventData eventData)
{
base.SaveChangesFailed(eventData);
}
// 提交数据库失败(异步)
public override Task SaveChangesFailedAsync(DbContextErrorEventData eventData, CancellationToken cancellationToken = default)
{
return base.SaveChangesFailedAsync(eventData, cancellationToken);
}
}
}

9.24.2.4 SavedChangesEvent 拦截

Fur 框架中为所有 AppDbContext 子类都提供了三个可重写的方法,这三个方法分别由三个事件触发:

  • 提交更改之前 SavingChanges 事件:触发 void SavingChangesEvent(object sender, SavingChangesEventArgs e) 方法
  • 提交更改之后 SavedChanges 事件:触发 void SavedChangesEvent(object sender, SavedChangesEventArgs e) 方法
  • 提交更改失败 SaveChangesFailed 事件:触发 void SaveChangesFailedEvent(object sender, SaveChangesFailedEventArgs e) 方法

通过这三个事件我们可以在数据库做增、删、改时候做拦截,比如设置创建时间、更新时间或其他默认操作

如自动添加租户Id:

protected override void SavingChangesEvent(object sender, SavingChangesEventArgs e)
{
// 获取当前事件对应上下文
var dbContext = sender as FurDbContext;
// 获取所有新增和更新的实体
var entities = dbContext.ChangeTracker.Entries()
.Where(u => u.State == EntityState.Added || u.State == EntityState.Modified);
foreach (var entity in entities)
{
switch (entity.State)
{
// 自动设置租户Id
case EntityState.Added:
entity.Property(nameof(Entity.TenantId)).CurrentValue = GetTenantId();
break;
// 排除租户Id
case EntityState.Modified:
entity.Property(nameof(Entity.TenantId)).IsModified = false;
break;
}
}
}

9.24.3 注册自定义过滤器

定义好过滤器之后,我们需要在数据库上下文中注册:

services.AddSqlitePool<FurDbContext>(interceptors: new IInterceptor[] {
new SqlConnectionProfilerInterceptor(),
new DbContextSaveChangesInterceptor(),
new SqlCommandProfilerInterceptor()
});

9.24.4 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/dbcontext-add-or-update/index.html b/docs/docs/dbcontext-add-or-update/index.html index c953bca31de..63b9d55c516 100644 --- a/docs/docs/dbcontext-add-or-update/index.html +++ b/docs/docs/dbcontext-add-or-update/index.html @@ -6,7 +6,7 @@ 9.7 新增或更新操作 | Fur - + @@ -99,7 +99,7 @@
// 示例七
await user.InsertOrUpdateExcludeNowAsync(new[] { u=>u.Name, u=>u.Age});
// 示例八
await user.InsertOrUpdateExcludeNowAsync(new[] {"Age", "Name"});

9.5.7 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/dbcontext-add/index.html b/docs/docs/dbcontext-add/index.html index 6716ebb2987..8e46269d4c3 100644 --- a/docs/docs/dbcontext-add/index.html +++ b/docs/docs/dbcontext-add/index.html @@ -6,7 +6,7 @@ 9.5 新增操作 | Fur - + @@ -50,7 +50,7 @@
// 示例二
await repository.InsertNowAsync(new List<User> { user, user2 });
// 示例三
await repository.InsertNowAsync(new[] {user, user2 });
小知识

所有带 Now 结尾的表示立即提交到数据库,也就是立即调用 SaveChangesSaveChangesAsync

9.5.5 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/dbcontext-audit/index.html b/docs/docs/dbcontext-audit/index.html index 59a79446529..e19b3760cc5 100644 --- a/docs/docs/dbcontext-audit/index.html +++ b/docs/docs/dbcontext-audit/index.html @@ -6,7 +6,7 @@ 9.22 审计日志 | Fur - + @@ -34,7 +34,7 @@
object oldValue = null;
// 如果是新增数据,则 databaseValues 为空,所以需要判断一下
if (databaseValues != null)
{
oldValue = databaseValues[propName];
}
// 插入审计日志表
dbContext.Audits.Add(new Audit
{
Table = entityType.Name, // 表名
Column = propName, // 更新的列
NewValue = newValue, // 新值
OldValue = oldValue, // 旧值
CreatedTime = DateTime.Now, // 操作时间
UserId = userId, // 操作人
Operate = entity.State.ToString(); // 操作方式:新增、更新、删除
});
}
}
}
}
}
小知识

如果对性能有所要求,那么建议审计日志通过 日志组件 写入数据库,如,通过 Nlog、Log4Net 这些等:

// 插入审计日志表
dbContext.Audits.Add(new Audit
{
Table = entityType.Name, // 表名
Column = propName, // 更新的列
newValue = newValue, // 新值
OldValue = oldValue, // 旧值
CreatedTime = DateTime.Now, // 操作时间
UserId = userId, // 操作人
Operate = entity.State.ToString(); // 操作方式:新增、更新、删除
});

替换为:

logger.Information(JsonConvert.SerializeObject(new Audit
{
Table = entityType.Name, // 表名
Column = propName, // 更新的列
newValue = newValue, // 新值
OldValue = oldValue, // 旧值
CreatedTime = DateTime.Now, // 操作时间
UserId = userId, // 操作人
Operate = entity.State.ToString(); // 操作方式:新增、更新、删除
}));

通过上面的例子,我们就可以对数据库所有的新增、更新、删除进行监控了。

9.22.4 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/dbcontext-batch/index.html b/docs/docs/dbcontext-batch/index.html index da3a34b1dfd..f7261c18612 100644 --- a/docs/docs/dbcontext-batch/index.html +++ b/docs/docs/dbcontext-batch/index.html @@ -6,7 +6,7 @@ 9.9 批量操作 | Fur - + @@ -29,7 +29,7 @@
// 根据条件批量更新
repository.Where(a => a.ItemId <= 500).BatchUpdate(a => new Item { Quantity = a.Quantity + 100 });
repository.Where(a => a.ItemId <= 500).BatchUpdate(new Item { Description = "Updated" });
await repository.Where(a => a.ItemId <= 500).BatchUpdateAsync(new Item { Description = "Updated" });
// 批量更新指定列
var updateColumns = new List<string> { nameof(Item.Quantity) };
var q = repository.Where(a => a.ItemId <= 500);
int affected = q.BatchUpdate(new Item { Description = "Updated" }, updateColumns);

9.9.3 批量操作性能

Operations\Rows100,000 EF100,000 EFBulk1,000,000 EFBulk
Insert38.98 s2.10 s17.99 s
Update109.25 s3.96 s31.45 s
Delete7.26 s2.04 s12.18 s
---------------------------------------------------------------
Together70.70 s5.88 s56.84 s

9.9.4 反馈与建议

与我们交流

给 Fur 提 Issue


了解更多

想了解更多 EFCore.BulkExtensions 知识可查阅 EFCore.BulkExtensions 开源仓库

- + diff --git a/docs/docs/dbcontext-code-first/index.html b/docs/docs/dbcontext-code-first/index.html index 4266501487e..ef38bd4a643 100644 --- a/docs/docs/dbcontext-code-first/index.html +++ b/docs/docs/dbcontext-code-first/index.html @@ -6,7 +6,7 @@ 9.20 模型生成数据库 | Fur - + @@ -25,7 +25,7 @@
/// <summary>
/// 年龄
/// </summary>
public int Age { get; set; }
/// <summary>
/// 住址
/// </summary>
public string Address { get; set; }
}
}
实体约定

所有数据库实体必须直接或间接继承 IEntity 接口。

9.20.2.2 打开 程序包管理控制台

9.20.2.3 切换默认项目

程序包管理控制台 默认项目设置为 Fur.Database.Migrations

9.20.2.4 创建模型版本

Add-Migration v1.0.0
特别说明

v1.0.0 是此处数据库更改的版本号,可以写任何字符串,但推荐写版本号,每次 +1

最终命令如下:

PM> Add-Migration v1.0.0
Build started...
Build succeeded.
Microsoft.EntityFrameworkCore.Model.Validation[10400]
Sensitive data logging is enabled. Log entries and exception messages may include sensitive application data, this mode should only be enabled during development.
Microsoft.EntityFrameworkCore.Infrastructure[10403]
Entity Framework Core 5.0.0-rc.1.20451.13 initialized 'FurDbContext' using provider 'Microsoft.EntityFrameworkCore.Sqlite' with options: SensitiveDataLoggingEnabled DetailedErrorsEnabled MaxPoolSize=100 MigrationsAssembly=Fur.Database.Migrations
To undo this action, use Remove-Migration.
PM>

生成成功后,Fur.Database.Migrations 项目下会新增 Migrations 文件夹(如果没有),同时本次的架构生成文件,如:

9.20.2.5 更新到数据库

Update-Database

执行该命令后,数据库就会自动根据模型生成对于的表。

小知识

如果 Update-Database 后面带字符串参数,则会自动还原数据库到指定版本,如:

Update-Database v0.0.3

将数据库还原到 v0.0.3 版本

9.20.3 更新模型

如果模型改变了,重复上面操作即可,如:

Add-Migration v1.0.1
Update-Database

9.20.4 导出 Sql

有些时候,我们没有直接更新数据库的权限,或者怕出问题,我们都会先生成 Sql 看看,这时候只需要通过 Script-Migration 导出即可,如:

Script-Migration

9.20.5 反馈与建议

与我们交流

给 Fur 提 Issue


了解更多

想了解更多 正向工厂 知识可查阅 EF Core - 管理数据库架构 章节。

- + diff --git a/docs/docs/dbcontext-db-first/index.html b/docs/docs/dbcontext-db-first/index.html index 9de3e28f5e3..584f7f02e99 100644 --- a/docs/docs/dbcontext-db-first/index.html +++ b/docs/docs/dbcontext-db-first/index.html @@ -6,7 +6,7 @@ 9.19 数据库生成模型 | Fur - + @@ -58,7 +58,7 @@
}
}
Fur Tools v1.0.0 全部实体生成成功!
PM>

9.13.4 命令参数配置

Fur Tools Cli 支持多个参数配置,使用方法只需要在命令后面添加即可,如:

&"../tools/cli.ps1" -Context 数据库上下文名 -ConnectionName 连接字符串Key

支持参数如下:

  • -Tables:配置要生成的数据库表,数组类型,如果为空,则生成数据库所有表和视图。如:-Tables Person,PersonDetails
  • -Context:配置数据库上下文,默认 FurDbContext,如果有多个数据库上下文,则此参数必须配置
  • -ConnectionName:配置数据库连接字符串,对于 appsetting.json 中的 Key
  • -OutputDir:生成实体代码输出目录,默认为:./Fur.Core/Entities/
  • -DbProvider:数据库提供器,默认是 Microsoft.EntityFrameworkCore.SqlServer,其他数据库请指定对应程序集
    • SqlServerMicrosoft.EntityFrameworkCore.SqlServer
    • SqliteMicrosoft.EntityFrameworkCore.Sqlite
    • CosmosMicrosoft.EntityFrameworkCore.Cosmos
    • InMemoryDatabaseMicrosoft.EntityFrameworkCore.InMemory
    • MySqlPomelo.EntityFrameworkCore.MySql
    • PostgreSQLNpgsql.EntityFrameworkCore.PostgreSQL
    • OracleCitms.EntityFrameworkCore.Oracle
    • DmMicrosoft.EntityFrameworkCore.Dm
  • -EntryProject:Web 启用项目层名,默认 Fur.Web.Entry
  • -CoreProject:实体项目层名,默认 Fur.Core
  • -DbContextLocators:多数据库上下文定位器,默认 MasterDbContextLocator,支持多个,如:MasterDbContextLocator,MySqlDbContextLocator
  • -Product:解决方案默认前缀,如 Fur
  • -UseDatabaseNames:是否保持生成和数据库、表一致的名称

9.13.5 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/dbcontext-delete/index.html b/docs/docs/dbcontext-delete/index.html index de94e4c233d..2276412020f 100644 --- a/docs/docs/dbcontext-delete/index.html +++ b/docs/docs/dbcontext-delete/index.html @@ -6,7 +6,7 @@ 9.8 删除操作 | Fur - + @@ -66,7 +66,7 @@
// 示例五
await entity.FakeDeleteAsync();
// 示例六
await repository.UpdateIncludeAsync(user, u => u.IsDeleted);

9.8.9 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/dbcontext-filter/index.html b/docs/docs/dbcontext-filter/index.html index 232d5a56910..44867cffb52 100644 --- a/docs/docs/dbcontext-filter/index.html +++ b/docs/docs/dbcontext-filter/index.html @@ -6,7 +6,7 @@ 9.23 实体/全局查询筛选器 | Fur - + @@ -33,7 +33,7 @@
// 创建表达式元素
var parameter = Expression.Parameter(metadata.ClrType, "u");
var properyName = Expression.Constant(nameof(Entity.IsDeleted));
var propertyValue = Expression.Constant(false);
// 构建表达式 u => EF.Property<bool>(u, "IsDeleted") == false
var expressionBody = Expression.Equal(Expression.Call(typeof(EF), nameof(EF.Property), new[] { typeof(bool) }, parameter, properyName), propertyValue);
var expression = Expression.Lambda(expressionBody, parameter);
return expression;
}
}
}
小建议

如果对动态构建 LambdaExpression 不熟悉的朋友,可以使用 System.Linq.Dynamic.Corehttps://github.com/zzzprojects/System.Linq.Dynamic.Core

9.23.3 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/dbcontext-function/index.html b/docs/docs/dbcontext-function/index.html index 15389192afa..49f15c50fb0 100644 --- a/docs/docs/dbcontext-function/index.html +++ b/docs/docs/dbcontext-function/index.html @@ -6,7 +6,7 @@ 9.14 函数操作 | Fur - + @@ -45,7 +45,7 @@
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity(typeof(F_Person)).HasNoKey();
modelBuilder.HasDbFunction(() => GetPersons(default));
}
}
}

9.14.5.4 在 Linq 中使用

IQueryable<F_Person> query = _repository.DynamicDbContext.GetPersons(1);
var result = query.Where(u => u.Name.Equals("Fur")).ToList();

最终生成 Sql

SELECT [g].Id, [g].Name, [g].Age, [g].Address
FROM dbo.GetPersons(1) AS [g]
WHERE [g].Name == N'Fur';

9.14.6 在 EF Core 内置函数

EF Core 为我们提供了很多常用的内置函数,可以在 Lambda 条件中使用,主要是通过 EF.Functions 调用,如:

_repository.Where(u => EF.Functions.DateDiffHour(u.CreatedDt, DateTime.Now) > 8).FirstOrDefault();

这个语句使用了 EF.Functions.DateDiffHour 最终生成的 Sql 如下:

SELECT TOP(1) [a].*
FROM [dbo].[TEST] AS [a]
WHERE DATEDIFF(HOUR, [a].[CREATED_DT], GETDATE()) > 8

EF Core 内置函数就不一一列出了,可以通过 EF.Functions 查看更多,如果不能满足自己的需求,那么可以自定义 Linq 标量函数

9.14.7 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/dbcontext-hight-query/index.html b/docs/docs/dbcontext-hight-query/index.html index 5f26b213d39..4b634f6b0b3 100644 --- a/docs/docs/dbcontext-hight-query/index.html +++ b/docs/docs/dbcontext-hight-query/index.html @@ -6,7 +6,7 @@ 9.11 高级查询操作 | Fur - + @@ -52,7 +52,7 @@
namespace Fur.Core
{
public class Person : Entity, IEntityTypeBuilder<Person>
{
public string Name { get; set; }
/// <summary>
/// 配置实体关系
/// </summary>
/// <param name="entityBuilder"></param>
/// <param name="dbContext"></param>
/// <param name="dbContextLocator"></param>
public void Configure(EntityTypeBuilder<City> entityBuilder, DbContext dbContext, Type dbContextLocator)
{
entityBuilder.ToSqlQuery(
@"select * from dbo.person.2020-09-19
union all
select * from dbo.person.2020-09-20");
}
}
}
var posts = repository.Where(u => u.Id > 10).ToList();

9.11.12 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/dbcontext-locator/index.html b/docs/docs/dbcontext-locator/index.html index cb7664add55..19c01b36576 100644 --- a/docs/docs/dbcontext-locator/index.html +++ b/docs/docs/dbcontext-locator/index.html @@ -6,7 +6,7 @@ 9.2 数据库上下文定位器 | Fur - + @@ -23,7 +23,7 @@
namespace Fur.Core
{
public sealed class FurDbContextLocator : IDbContextLocator
{
}
}

9.2.4 默认数据库上下文定位器

Fur 框架中已经提供了 MasterDbContextLocator 默认数据库上下文定位器,所以默认数据库上下文只需继承 AppDbContext<TDbContext> 即可。

AppDbContext<TDbContext> 定义代码如下:

using Fur.DependencyInjection;
using Microsoft.EntityFrameworkCore;
namespace Fur.DatabaseAccessor
{
/// <summary>
/// 默认应用数据库上下文
/// </summary>
/// <typeparam name="TDbContext">数据库上下文</typeparam>
[NonBeScan]
public abstract class AppDbContext<TDbContext> : AppDbContext<TDbContext, MasterDbContextLocator>
where TDbContext : DbContext
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="options"></param>
public AppDbContext(DbContextOptions<TDbContext> options) : base(options)
{
}
}
}

9.2.5 数据库上下文定位器支持对象

目前数据库上下文支持以下多个对象:

  • AppDbContext<TEntity, TDbContextLocator>:数据上下文
  • IRepository<TEntity, TDbContextLocator:实体仓储
  • ISqlRepository<TDbContextLocator>: Sql 操作仓储
  • Func<Type, DbContext>:依赖注入获取数据库上下文
  • Entity<Tkey, TDbContextLocator> :实体配置
  • EntityBase<Tkey, TDbContextLocator1, ... TDbContextLocator8>:实体配置
  • EntityNotKey<TDbContextLocator1, ... TDbContextLocator8>:无键实体配置
  • IEntitySeedData<TEntity, TDbContextLocator1, ... TDbContextLocator8>:种子数据配置
  • IEntityTypeBuilder<TEntity, TDbContextLocator1, ... TDbContextLocator8>:实体类型构建器
  • IModelBuilderFilter<TDbContextLocator1, ... TDbContextLocator8>:模型构建筛选器
  • [QueryableFunction(DbContextLocators=Type[])]:查询函数

9.2.6 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/dbcontext-multi-database/index.html b/docs/docs/dbcontext-multi-database/index.html index fc9636dfad6..9fbde824e78 100644 --- a/docs/docs/dbcontext-multi-database/index.html +++ b/docs/docs/dbcontext-multi-database/index.html @@ -6,7 +6,7 @@ 9.18 多数据库操作 | Fur - + @@ -38,7 +38,7 @@
// 支持一个数据库
public class Person: IEntity<MySqlDbContextLocator>
{
// ....
}
// 支持多个数据库
public class Person: IEntity<MySqlDbContextLocator, SqliteDbContextLocator>
{
// ....
}
小知识

所有的 实体依赖接口或抽象类 都支持泛型方式 指定 数据库上下文定位器,最多支持 8 个。

9.18.3.5 Linq 函数方式

public static class QueryFunctions
{
[QueryableFunction("FN_GetId", "dbo", typeof(MySqlDbContextLocator), typeof(SqliteDbContextLocator))]
public static int GetId(int id) => throw new NotSupportedException();
}

9.18.4 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/dbcontext-proc/index.html b/docs/docs/dbcontext-proc/index.html index 16e3dc5ea7e..098da3b5913 100644 --- a/docs/docs/dbcontext-proc/index.html +++ b/docs/docs/dbcontext-proc/index.html @@ -6,7 +6,7 @@ 9.13 存储过程操作 | Fur - + @@ -114,7 +114,7 @@
// 获取 RETURN 返回值
var reval = result.ReturnValue;
// 获取返回结果集
var (list1,list2) = result.Result;
关于异步

Fur 框架每一个数据库操作都支持异步方式,由于篇幅有限,就不列举异步方式了。

9.13.3 关于 [DbParameter]

[DbParameter] 特性是用来标注 Sql函数存储过程 参数的,可配置属性:

  • Direction:设置参数方向,ParameterDirection 枚举类型,默认 ParameterDirection.Input
  • DbType:设置参数类型,DbType 枚举类型,无默认
  • Size:设置参数长度的,int 类型

其中 Direction 属性是默认构造函数参数。

9.13.4 关于 ProcedureOutputResult

ProcedureOutputResultProcedureOutputResult<TResult> 是复杂存储过程执行返回模型类,有以下属性:

  • OutputValues:多个输出值,ProcedureOutputValue 类型
  • ReturnValue:返回值,object 类型
  • Result:结果集,非泛型版本是 DataSet类型,否则是 泛型类型

9.13.5 存储过程参数

所有 sql 参数都支持四种方式:

  • DbParameter[]:数组类型
  • new {}:匿名类型
  • new Class{}:强类型类型(支持复杂存储过程参数)
  • Dictionary<string,object> 类型

9.13.6 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/dbcontext-query/index.html b/docs/docs/dbcontext-query/index.html index 50e9b436c24..bb2003874c2 100644 --- a/docs/docs/dbcontext-query/index.html +++ b/docs/docs/dbcontext-query/index.html @@ -6,7 +6,7 @@ 9.10 查询操作 | Fur - + @@ -133,7 +133,7 @@
// 示例二
_testRepository.Where(u => u.Name.EndWith("Fur"));
// 示例三
_testRepository.Where(u => u.Name.Contains("Fur"));

9.10.6.9 Case When

数据库中的 Case When 实际上对应的是我们程序中的 三元表达式 ,也就是使用 三元表达式 即可自动生成 Case When 语句。

9.10.7 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/dbcontext-read-write/index.html b/docs/docs/dbcontext-read-write/index.html index 97b9f3de9fc..09745c9bc16 100644 --- a/docs/docs/dbcontext-read-write/index.html +++ b/docs/docs/dbcontext-read-write/index.html @@ -6,7 +6,7 @@ 9.26 读写分离/主从复制 | Fur - + @@ -33,7 +33,7 @@
/// <summary>
/// 查询走从库
/// </summary>
/// <returns></returns>
public List<Person> Get()
{
return _msRepository.Slave1<Person>().AsEnumerable();
}
}
}

9.26.3 主从复制

主从复制:是一种数据备份的方案。

简单来说,是使用两个或两个以上相同的数据库,将一个数据库当做主数据库,而另一个数据库当做从数据库。在主数据库中进行相应操作时,从数据库记录下所有主数据库的操作,使其二者一模一样。

9.26.4 主从复制几种方式

9.26.4.1 同步复制

所谓的同步复制,意思是 Master 的变化,必须等待 Slave-1,Slave-2,...,Slave-n 完成后才能返回。 这样,显然不可取,比如,在 Web 前端页面上,用户增加了条记录,需要等待很长时间。

9.26.4.2 异步复制

如同 AJAX 请求一样。Master 只需要完成自己的数据库操作即可。至于 Slaves 是否收到二进制日志,是否完成操作,不用关心。(推荐方式)

9.26.4.3 半同步复制

Master 只保证 Slaves 中的一个操作成功,就返回,其他 Slave 不管。

下面将使用 SqlServer 简单配置主从复制功能。

9.26.5 SqlServer 主库配置

9.26.5.1 添加 本地发布

9.26.5.2 选择 分发服务器

9.26.5.3 启用 代理

9.26.5.4 发布数据库

9.26.5.5 快照发布

具体选择何种发布类型,视具体业务场景而定。

9.26.5.6 选择发布项目

9.26.5.7 配置分发计划

9.26.5.8 配置安全设置

9.26.5.9 完成配置

9.26.6 SqlServer 从库配置

9.26.6.1 添加 本地订阅

9.26.6.2 选择 分发服务器

9.26.6.3 选择 分发代理位置

9.26.6.4 选择 订阅数据库

9.26.6.5 选择 分发安全设置

9.26.6.6 选择 同步计划

9.26.6.7 完成订阅

9.26.7 分发定义监视

9.26.8 查看主从复制结果

特别特性

主从复制有一定迟延性,所以系统设计要有一定“容忍性"。

9.26.9 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/dbcontext-repository/index.html b/docs/docs/dbcontext-repository/index.html index 4a8556a6398..a2a25d6b7c4 100644 --- a/docs/docs/dbcontext-repository/index.html +++ b/docs/docs/dbcontext-repository/index.html @@ -6,7 +6,7 @@ 9.4 仓储模式 | Fur - + @@ -28,7 +28,7 @@
// 其他更多数据库一样的操作

另外任何仓储或实体配置都支持多个数据库同时操作

仓储方式

IRepository<Person, MsSqlDbContextLocator> mssqlRepository
ISqlRepository<MsSqlDbContextLocator> mssqlRepository;

动态 sql 方式

"select * from person".Change<MsSqlDbContextLocator>().SqlQuery();

实体配置方式

public class User:Entity<MsSqlDbContextLocator, MySqlDbContextLocator>
{
}

Sql 代理方式

[SqlFunction("funcName", DbContextLocator = typeof(MySqlDbContextLocator))]
int GetAge(int id);

Linq 中方式

[QueryableFunction("funcName","dbo", DbContextLocator = typeof(MySqlDbContextLocator))]
string GetName()=> throw Oops.Oh("不支持该数据库操作");

9.4.5 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/dbcontext-seed-data/index.html b/docs/docs/dbcontext-seed-data/index.html index 4754a5e356b..221799dd849 100644 --- a/docs/docs/dbcontext-seed-data/index.html +++ b/docs/docs/dbcontext-seed-data/index.html @@ -6,7 +6,7 @@ 9.21 实体种子数据 | Fur - + @@ -27,7 +27,7 @@
namespace Fur.Application
{
public class PersonSeedData : IEntitySeedData<Person>
{
// 配置种子数据
public IEnumerable<Person> HasData(DbContext dbContext, Type dbContextLocator)
{
return new List<Person>
{
new Person { Id = 1, Name = "百小僧", Address = "广东省中山市" },
new Person { Id = 2, Name = "新生帝", Address = "广东省珠海市" }
};
}
}
}

9.21.3 导航属性

通常我们的实体有 一对多多对多等外键关系,那么我们需要单独为每一个实体添加数据种子,而不是直接写在主表中。

9.21.4 多个数据库种子数据

Fur 提供泛型的方式支持多个数据库种子数据设定,如:

using Fur.DatabaseAccessor;
using System.Collections.Generic;
namespace Fur.Application
{
public class PersonSeedData : IEntitySeedData<Person, MySqlDbContextLocator, SqliteDbContextLocator>
{
// 配置种子数据
public IEnumerable<Person> HasData(DbContext dbContext, Type dbContextLocator)
{
return new List<Person>
{
new Person { Id = 1, Name = "百小僧", Address = "广东省中山市" },
new Person { Id = 2, Name = "新生帝", Address = "广东省珠海市" }
};
}
}
}

上面的例子表示同时为 MySqlDbContextSqliteDbContext 创建种子数据。

9.21.5 反馈与建议

与我们交流

给 Fur 提 Issue


了解更多

想了解更多 数据种子 知识可查阅 EF Core - 数据种子设定 章节。

- + diff --git a/docs/docs/dbcontext-sql-proxy/index.html b/docs/docs/dbcontext-sql-proxy/index.html index face45ec0e4..a01649efa8f 100644 --- a/docs/docs/dbcontext-sql-proxy/index.html +++ b/docs/docs/dbcontext-sql-proxy/index.html @@ -6,7 +6,7 @@ 9.17 Sql 高级代理 | Fur - + @@ -71,7 +71,7 @@
namespace Fur.Application
{
public interface ISql : ISqlDispatchProxy
{
[SqlFunction("FN_Name")] // 标量函数
string GetValue(MyParam dto);
[SqlProcedure("FN_Name")] // 表值函数
List<Person> GetPersons(int id);
}
}
补充说明

Sql 代理会自动判断返回值然后自动执行特定函数类型。

9.17.6 为什么用它?

通过上面的例子大家就可以了解,这种方式操作 sql 非常简单,而且极易维护。大家不用去关系返回值,关心用哪个方法,所有东西会自动给你处理好。

所以,如果需要用 Sql 操作,推荐使用 Sql 高级代理。

9.17.7 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/dbcontext-sql-template/index.html b/docs/docs/dbcontext-sql-template/index.html index ded0cc234ac..43830889dda 100644 --- a/docs/docs/dbcontext-sql-template/index.html +++ b/docs/docs/dbcontext-sql-template/index.html @@ -6,7 +6,7 @@ 9.16 Sql 模板 | Fur - + @@ -23,7 +23,7 @@
// 懒人方式
var users = "#(Select.User)".SqlQuery<User>(new { id = 1});
// Sql 代理方式
[SqlExecute("#(Select.User)")]
List<User> GetUser(int id);

9.16.3.2 高级嵌套

var users = repository.SqlQuery<User>(
@"select * from user u
left join #(User.Detail) d on u.Id = d.UserId
where id > @id");

9.16.4 Sql 模板配置

9.16.4.1 普通模式

{
"Select.User": "select * from User"
}

9.16.4.2 更多配置

{
"Select.User": {
"Sql": "select * from User where id > @id and Name = @name",
"Params": [
{
"Name": " Id",
"Value": "1",
"DbType": "Int16",
"Size": 10
},
{
"Name": " Name",
"Value": "百小僧",
"DbType": "String",
"Size": 10
}
]
}
}

9.16.5 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/dbcontext-sql/index.html b/docs/docs/dbcontext-sql/index.html index 463d7a33839..32137e3cba6 100644 --- a/docs/docs/dbcontext-sql/index.html +++ b/docs/docs/dbcontext-sql/index.html @@ -6,7 +6,7 @@ 9.15 Sql 操作 | Fur - + @@ -168,7 +168,7 @@
// 不再举例子。。。。。。
补充说明

不管是那种方式操作 Sql ,方法名参数都是一致的,如:

  • SqlQuery
  • SqlQueryAsync
  • SqlQueries
  • SqlQueriesAsync
  • SqlNonQuery
  • SqlNonQueryAsync
  • SqlScalar
  • SqlScalarAsync
  • SqlProcedureQuery
  • SqlProcedureQueryAsync
  • SqlProcedureQueries
  • SqlProcedureQueriesAsync
  • SqlProcedureScalar
  • SqlProcedureScalarAsync
  • SqlProcedureNonQuery
  • SqlProcedureNonQueryAsync
  • SqlProcedureOutput
  • SqlProcedureOutputAsync
  • SqlFunctionScalar
  • SqlFunctionScalarAsync
  • SqlFunctionQuery
  • SqlFunctionQuery

9.15.6 IRepository 操作

IRepository 也能操作 sql,调用方法也是和上面一致的,如:

var dataTable = repository.Sql().SqlQuery("select * from person");
特别说明

由于篇幅有限,不再列举所有例子。

9.15.7 IRepository<TEntity> 操作

IRepository<TEntity> 也能操作 sql,调用方法也是和上面一致的,如:

var dataTable = personRepository.SqlQuery("select * from person");
特别说明

由于篇幅有限,不再列举所有例子。

9.15.8 关于 Sql 参数

所有 sql存储过程函数 参数都支持四种方式:

  • DbParameter[]:数组类型
  • new {}:匿名类型
  • new Class{}:强类型类型(支持复杂存储过程参数)
  • Dictionary<string,object> 类型
小知识

建议除了复杂的存储过程(带 OUTPUT/RETURN)的以外,所有参数建议使用 new {} 匿名类型,如果需要动态参数,则可以使用 Dictionary<string,object> 类型。

9.15.9 多数据库 Sql 操作 💯 💛

Fur 框架拥有非常灵活的多数据库操作方式,只需通过多数据库上下文定位器即可动态切换数据库。

9.15.9.1 懒人无敌 🐮 方式

var dataTable = "select * from person".Change<MySqlDbContextLocator>().SqlQuery();
var persons = "select * from person whre id > @id".Change<SqliteDbContextLocator>().SqlQuery<Person>();
补充说明

懒人方式 只需要通过 Change<TDbContextLocator> 方式即可动态切换数据库。

9.15.9.2 ISqlRepository 方式

只需要通过 ISqlRepository<TDbContextLocator> 注入或通过 sqlRepository.Change<TDbContextLocator>() 切换。

9.15.9.3 IRepository 方式

只需要通过 repository.Change<TDbContextLocator>() 获取即可。

9.15.9.4 IRepository<TEntity> 方式

只需要通过 IRepository<TEntity, TDbContextLocator> 注入或通过 personRepository.Change<TEntity, TDbContextLocator>() 切换。

9.15.10 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/dbcontext-update/index.html b/docs/docs/dbcontext-update/index.html index e21fca97b9f..7dbad9feba0 100644 --- a/docs/docs/dbcontext-update/index.html +++ b/docs/docs/dbcontext-update/index.html @@ -6,7 +6,7 @@ 9.6 更新操作 | Fur - + @@ -193,7 +193,7 @@
// 示例二
await repository.UpdateNowAsync(new List<User> { user, user2 });
// 示例三
await repository.UpdateNowAsync(new[] {user, user2 });
小知识

所有带 Now 结尾的表示立即提交到数据库,也就是立即调用 SaveChangesSaveChangesAsync

9.6.15 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/dbcontext-view/index.html b/docs/docs/dbcontext-view/index.html index 0586f4346f3..00c94bf10ed 100644 --- a/docs/docs/dbcontext-view/index.html +++ b/docs/docs/dbcontext-view/index.html @@ -6,7 +6,7 @@ 9.12 视图操作 | Fur - + @@ -29,7 +29,7 @@
public FurService(IRepository<V_Person> repository)
{
// 初始化只读仓储
_readableRepository = repository.Constraint<IReadableRepository<V_Person>>();
}
/// <summary>
/// 读取视图
/// </summary>
/// <returns></returns>
public async Task<List<V_Person>> GetVPerson()
{
var list = await _readableRepository.AsAsyncEnumerable();
return list;
}
}
}
小知识

通过 .Constraint<TEntity,TDbContextLocator> 方法可以将仓储约束为特定仓储,如只读仓储,可读可写仓储,只新增仓储等。

9.12.5 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/dbcontext/index.html b/docs/docs/dbcontext/index.html index ab255696410..1e43964f720 100644 --- a/docs/docs/dbcontext/index.html +++ b/docs/docs/dbcontext/index.html @@ -6,7 +6,7 @@ 9.1 数据库上下文 | Fur - + @@ -32,7 +32,7 @@
options.AddDbPool<SecondDbContext, SecondDbContextDbContextLocator>(DbProvider.SqlServer); // 第二个数据库
options.AddDbPool<ThirdDbContext, ThirdDbContextDbContextLocator>(DbProvider.SqlServer); // 第三个数据库

9.1.8 动态数据库上下文对象

Fur 框架中,数据库上下文是定义在 Fur.EntityFramework.Core 项目层,并且该层不被 Fur.ApplicationFur.Core 等层引用。

所以就不能直接在 Fur.Application 项目层直接使用 Fur.EntityFramework.Core 定义的数据库上下文。

Fur 为了解决这个问题,提供了两种方式处理:

  • respository.DbContext :当前数据库上下文对象,返回是 DbContext 抽象类型
  • respository.DynamicDbContext:当前数据库上下文对象,返回的是 dynamic 类型

如果你只是想使用 DbContext 的功能,直接使用 respository.DbContext 即可,如:

respository.DbContext.SaveChanges();

如果你想能够获取具体的数据库上下文类型,如 MyDbContext,那么使用 respository.DynamicDbContext 就可以获取到具体的 MyDbContext 类型。如:

var persons = respository.DynamicDbContext.Persons.Find(1);
var users = respository.DynamicDbContext.Users;

这样就可以直接操作 MyDbContext 定义的属性和方法了。

9.1.9 反馈与建议

与我们交流

给 Fur 提 Issue


了解更多

想了解更多 数据库上下文 知识可查阅 EF Core - 配置 DbContext 章节。

- + diff --git a/docs/docs/dependency-injection/index.html b/docs/docs/dependency-injection/index.html index b53e7df55d5..afcb20a2d49 100644 --- a/docs/docs/dependency-injection/index.html +++ b/docs/docs/dependency-injection/index.html @@ -6,7 +6,7 @@ 11. 依赖注入/控制反转 | Fur - + @@ -54,7 +54,7 @@
Console.WriteLine("SayHello 方法返回值:" + result);
return result;
}
}
}

之后我们只需要为 TestService 增加 [Injection] 特性即可,如:

[Injection(Proxy = typeof(LogDispatchProxy))]
public class TestService: ITestService, ITransient
{
public string SayHello(string word)
{
return $"Hello {word}";
}
}

之后 SayHello 方法被调用的时候就可以实现动态拦截了,比如这里写日志。

11.12.1 AOP 的作用

这种面向切面的能力(动态拦截/代理)可以实现很多很多功能,如:

  • 动态日志记录
  • 动态修改参数
  • 动态修改返回值
  • 动态方法重定向
  • 动态修改代码逻辑
  • 动态实现异常监听

还可以做更多更多的事情。

11.13 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/deploy/index.html b/docs/docs/deploy/index.html index 35b264f0414..7957942f4e2 100644 --- a/docs/docs/deploy/index.html +++ b/docs/docs/deploy/index.html @@ -6,7 +6,7 @@ 25. 托管部署 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/docs/docs/devops/index.html b/docs/docs/devops/index.html index 40da3c996aa..612d7ebdb74 100644 --- a/docs/docs/devops/index.html +++ b/docs/docs/devops/index.html @@ -6,7 +6,7 @@ 26. 持续部署集成 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/docs/docs/dynamic-api-controller/index.html b/docs/docs/dynamic-api-controller/index.html index fecb8992a20..232ffed9064 100644 --- a/docs/docs/dynamic-api-controller/index.html +++ b/docs/docs/dynamic-api-controller/index.html @@ -6,7 +6,7 @@ 5. 动态 WebAPI | Fur - + @@ -67,7 +67,7 @@
namespace Fur.Web.Entry.Controllers
{
public class MvcController : ControllerBase
{
public string Get()
{
return nameof(Fur);
}
}
}
注意事项

启用该配置后,如果 Mvc 控制器 没有任何 [Route] 特性,但是贴了 [ApiController] 特性将会报错。原因是 [ApiController] 特性内部做了路由特性检测。所以建议使用 [ApiDataValidation] 代替。

查看 ASP.NET Core - ApiBehaviorApplicationModelProvider 源码

5.11 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/entity/index.html b/docs/docs/entity/index.html index df1379251ce..b5d774da1e5 100644 --- a/docs/docs/entity/index.html +++ b/docs/docs/entity/index.html @@ -6,7 +6,7 @@ 9.3 数据库实体 | Fur - + @@ -34,7 +34,7 @@
// 配置数据库实体
public void Configure(EntityTypeBuilder<User> entityBuilder, DbContext dbContext, Type dbContextLocator)
{
entityBuilder.HasKey(u => u.Id);
entityBuilder.HasIndex(u => u.Name);
}
}
}

9.3.3.2 在任何实例类中配置

using Fur.DatabaseAccessor;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
namespace Fur.Core
{
public class SomeClass : IEntityTypeBuilder<User>
{
public void Configure(EntityTypeBuilder<User> entityBuilder, DbContext dbContext, Type dbContextLocator)
{
entityBuilder.HasKey(u => u.Id);
entityBuilder.HasIndex(u => u.Name);
}
}
}

如,上面例子,通过 SomeClass 配置 User 数据库实体。

9.3.4 数据库实体配置说明

Fur 框架会自动扫描所有继承 IEntity 接口的类进行 DbSet<TEntity> 注册,也就是实现自动配置 DbContextOnModelCreating

如果需要跳过自动注册,只需要贴 [NonAutomatic][SkipScan] 特性即可。一旦贴了次特性,那么就需要手动配置 DbContextOnModelCreating

9.3.5 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/errors/index.html b/docs/docs/errors/index.html index 7484704b70d..c4316e9c07e 100644 --- a/docs/docs/errors/index.html +++ b/docs/docs/errors/index.html @@ -6,7 +6,7 @@ 29.2 常见错误 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/docs/docs/event-bus/index.html b/docs/docs/event-bus/index.html index 9e71a3d5e5c..356503e00e1 100644 --- a/docs/docs/event-bus/index.html +++ b/docs/docs/event-bus/index.html @@ -6,7 +6,7 @@ 18. 事件总线 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/docs/docs/friendly-exception/index.html b/docs/docs/friendly-exception/index.html index cd6b9131e79..3551c3bfa2a 100644 --- a/docs/docs/friendly-exception/index.html +++ b/docs/docs/friendly-exception/index.html @@ -6,7 +6,7 @@ 7. 友好异常处理 | Fur - + @@ -54,7 +54,7 @@
return new JsonResult(new RESTfulResult
{
StatusCode = context.Result is EmptyResult ? StatusCodes.Status204NoContent : StatusCodes.Status200OK,
Successed = true,
Data = data,
Errors = null
});
}
/// <summary>
/// 验证失败返回值
/// </summary>
/// <param name="context"></param>
/// <param name="modelStates"></param>
/// <param name="validationResults"></param>
/// <param name="validateFaildMessage"></param>
/// <returns></returns>
public IActionResult OnValidateFailed(ActionExecutingContext context, ModelStateDictionary modelStates, Dictionary<string, IEnumerable<string>> validationResults, string validateFaildMessage)
{
return new JsonResult(new RESTfulResult
{
StatusCode = StatusCodes.Status400BadRequest,
Successed = false,
Data = null,
Errors = validationResults
});
}
}
}

之后在 Startup.cs 中注册即可:

services.AddControllers().AddUnifyResult<RESTfulResult, RESTfulResultProvider>();

7.14 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/get-start/index.html b/docs/docs/get-start/index.html index cb63da29673..bc7e9668701 100644 --- a/docs/docs/get-start/index.html +++ b/docs/docs/get-start/index.html @@ -6,7 +6,7 @@ 2. 一分钟入门 | Fur - + @@ -40,7 +40,7 @@
/// <summary>
/// 姓名
/// </summary>
[StringLength(32, MinimumLength = 2)]
public string Name { get; set; }
/// <summary>
/// 年龄
/// </summary>
public int Age { get; set; }
}
}

说好一分钟入门,你们用了多长时间。😁

- + diff --git a/docs/docs/gooduse/index.html b/docs/docs/gooduse/index.html index e3d0c5a2358..575533c7510 100644 --- a/docs/docs/gooduse/index.html +++ b/docs/docs/gooduse/index.html @@ -6,7 +6,7 @@ 29.3 最佳实践 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/docs/docs/grpc/index.html b/docs/docs/grpc/index.html index 17c3497507d..711adf7c7cc 100644 --- a/docs/docs/grpc/index.html +++ b/docs/docs/grpc/index.html @@ -6,7 +6,7 @@ 24. Grpc 服务 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/docs/docs/http/index.html b/docs/docs/http/index.html index 6bcdf482032..02e63081b9e 100644 --- a/docs/docs/http/index.html +++ b/docs/docs/http/index.html @@ -6,7 +6,7 @@ 20. 网络请求 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/docs/docs/index.html b/docs/docs/index.html index 8b7b64b9adc..8f735fbcd3a 100644 --- a/docs/docs/index.html +++ b/docs/docs/index.html @@ -6,7 +6,7 @@ 1.1 介绍 | Fur - + @@ -15,13 +15,13 @@ - +
-

1.1 介绍

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

🌭 开源地址

🍿 Docker 镜像

  • Docker Hub 线上镜像
docker run --name fur -p 5000:80 monksoul/fur:v1.0.0-2020.10.14
  • 手动 打包镜像

打开 CMD/Shell/PowerShell 进入 Fur 项目根目录打包 Fur 镜像:

docker build -t fur:v1.0.0-2020.10.14 .

打包成功后,直接 docker run

docker run --name fur -p 5000:80 fur:v1.0.0-2020.10.14

🥞 架构设计

正在整理中...

🥝 功能模块

🥐 框架依赖

Fur 为了追求极速入门,极致性能,尽可能的不使用或减少第三方依赖。目前 Fur 仅集成了以下三个依赖:

麻雀虽小五脏俱全。Fur 即使只集成了这三个依赖,但是主流的 依赖注入/控制反转AOP 面向切面编程,事件总线数据验证数据库操作 等等一个都不少。

🥗 环境要求

  • Visual Studio 2019 Preview 16.8 +
  • .NET 5 SDK +
  • .Net Standard 2.1 +

🥪 支持平台

  • 运行环境
    • Windows
    • Linux
    • MacOS
    • Docker/K8S/K3S/Rancher
    • Xamarin/MAUI
  • 数据库
    • SqlServer
    • Sqlite
    • Azure Cosmos
    • MySql
    • PostgreSQL
    • InMemoryDatabase
    • Oracle
    • Firebird
    • 达梦数据库
  • 应用部署
    • Kestrel
    • Nginx
    • Jexus
    • IIS
    • Apache
    • PM2
    • Supervisor
    • 单文件
    • 容器(Docker/K8S/K3S/Rancher)

🍖 关于性能

Fur 目前采用 Visual Studio 2019 Preview 16.8 自带性能测试和 JMeter 进行测试,由于篇幅有限,只贴部分测试图,测试结果如下:


🍚 关于作者

一个拥有 12 年开发经验 .NETer。喜欢分享,喜欢新技术,在互联网多个技术领域皆有涉猎。

🍤 项目成员

🎈 欢迎更多的开发者加入 Fur 大家庭。

🍝 他们都在用

  • 百签科技(广东)有限公司
  • 码为科技(广州)有限公司
  • 广州启顺国际货运代理有限公司
  • 森丰供应链服务(广州)有限公司
  • 中山赢友网络科技有限公司
  • 中山模思软件科技有限公司
  • 珠海市恒泰新软件有限责任公司
  • 珠海思诺锐创软件有限公司
  • 深圳市易胜科技有限公司
  • 重庆虫儿飞科技有限公司
  • 重庆林木森科技有限公司
  • 深圳市品立方科技有限公司

如果您的项目使用到 Fur 开发,可以告诉我们。

🍻 贡献代码

Fur 遵循 Apache-2.0 开源协议,欢迎大家提交 PRIssue

如果要为项目做出贡献,请查看贡献指南。

🍍 捐赠列表

注:排序按捐赠顺序书写

捐赠人昵称捐赠金额(元)附语
🤴 爱吃油麦菜100感谢您的开源项目!
👳‍♂️ 麦壳饼200感谢您的开源项目!
👨 Sun100感谢您的开源项目!
👶 d61761720感谢您的开源项目!
👦 Diqiguoji00816.66见贤思齐
👲 nodyang100感谢您的开源项目!
👳‍♀️ mictxd100吹过的牛都实现。
🧓 欧流全10希望将来超越 Spring
👨‍⚕️ lionkon10...看了框架感觉拿来学习是很不错的...
😤 好人!10...Nice 的小僧,我们的 dotnetchina 马上火起来了...
😮 木木 Woody10感谢您的开源项目!

非常感谢您们的支持,正是因为您们,中国开源才可以越走越远,Fur 越走越远。

🥔 QQ 交流群

🧆 友情链接

👉 Fur 👉 SqlSugar 👉 Layx 👉 t-io 👉 ThinkPHP 👉 Hutool 👉 BootstrapAdmin 👉 BootstrapBlazor

+

1.1 介绍

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

🌭 开源地址

🍿 Docker 镜像

  • Docker Hub 线上镜像
docker run --name fur -p 5000:80 monksoul/fur:v1.0.0-rc.final
  • 手动 打包镜像

打开 CMD/Shell/PowerShell 进入 Fur 项目根目录打包 Fur 镜像:

docker build -t fur:v1.0.0-rc.final .

打包成功后,直接 docker run

docker run --name fur -p 5000:80 fur:v1.0.0-rc.final

🥞 架构设计

正在整理中...

🥝 功能模块

🥐 框架依赖

Fur 为了追求极速入门,极致性能,尽可能的不使用或减少第三方依赖。目前 Fur 仅集成了以下三个依赖:

麻雀虽小五脏俱全。Fur 即使只集成了这三个依赖,但是主流的 依赖注入/控制反转AOP 面向切面编程,事件总线数据验证数据库操作 等等一个都不少。

🥗 环境要求

  • Visual Studio 2019 Preview 16.8 +
  • .NET 5 SDK +
  • .Net Standard 2.1 +

🥪 支持平台

  • 运行环境
    • Windows
    • Linux
    • MacOS
    • Docker/K8S/K3S/Rancher
    • Xamarin/MAUI
  • 数据库
    • SqlServer
    • Sqlite
    • Azure Cosmos
    • MySql
    • PostgreSQL
    • InMemoryDatabase
    • Oracle
    • Firebird
    • 达梦数据库
  • 应用部署
    • Kestrel
    • Nginx
    • Jexus
    • IIS
    • Apache
    • PM2
    • Supervisor
    • 单文件
    • 容器(Docker/K8S/K3S/Rancher)

🍖 关于性能

Fur 目前采用 Visual Studio 2019 Preview 16.8 自带性能测试和 JMeter 进行测试,由于篇幅有限,只贴部分测试图,测试结果如下:


🍚 关于作者

一个拥有 12 年开发经验 .NETer。喜欢分享,喜欢新技术,在互联网多个技术领域皆有涉猎。

🍤 项目成员

🎈 欢迎更多的开发者加入 Fur 大家庭。

🍝 他们都在用

  • 百签科技(广东)有限公司
  • 码为科技(广州)有限公司
  • 广州启顺国际货运代理有限公司
  • 森丰供应链服务(广州)有限公司
  • 中山赢友网络科技有限公司
  • 中山模思软件科技有限公司
  • 珠海市恒泰新软件有限责任公司
  • 珠海思诺锐创软件有限公司
  • 深圳市易胜科技有限公司
  • 重庆虫儿飞科技有限公司
  • 重庆林木森科技有限公司
  • 深圳市品立方科技有限公司

如果您的项目使用到 Fur 开发,可以告诉我们。

🍻 贡献代码

Fur 遵循 Apache-2.0 开源协议,欢迎大家提交 PRIssue

如果要为项目做出贡献,请查看贡献指南。

🍍 捐赠列表

注:排序按捐赠顺序书写

捐赠人昵称捐赠金额(元)附语
🤴 爱吃油麦菜100感谢您的开源项目!
👳‍♂️ 麦壳饼200感谢您的开源项目!
👨 Sun100感谢您的开源项目!
👶 d61761720感谢您的开源项目!
👦 Diqiguoji00816.66见贤思齐
👲 nodyang100感谢您的开源项目!
👳‍♀️ mictxd100吹过的牛都实现。
🧓 欧流全10希望将来超越 Spring
👨‍⚕️ lionkon10...看了框架感觉拿来学习是很不错的...
😤 好人!10...Nice 的小僧,我们的 dotnetchina 马上火起来了...
😮 木木 Woody10感谢您的开源项目!

非常感谢您们的支持,正是因为您们,中国开源才可以越走越远,Fur 越走越远。

🥔 QQ 交流群

🧆 友情链接

👉 Fur 👉 SqlSugar 👉 Layx 👉 t-io 👉 ThinkPHP 👉 Hutool 👉 BootstrapAdmin 👉 BootstrapBlazor

- + @@ -30,6 +30,6 @@ - + \ No newline at end of file diff --git a/docs/docs/job/index.html b/docs/docs/job/index.html index aac4a156c95..dfb5ab60e2d 100644 --- a/docs/docs/job/index.html +++ b/docs/docs/job/index.html @@ -6,7 +6,7 @@ 22. 任务调度 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/docs/docs/local-language/index.html b/docs/docs/local-language/index.html index d02648a2b27..c3cf2247b92 100644 --- a/docs/docs/local-language/index.html +++ b/docs/docs/local-language/index.html @@ -6,7 +6,7 @@ 16. 多语言处理 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/docs/docs/logging/index.html b/docs/docs/logging/index.html index 1bdb9180f80..3f9195907ac 100644 --- a/docs/docs/logging/index.html +++ b/docs/docs/logging/index.html @@ -6,7 +6,7 @@ 19. 日志记录 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/docs/docs/object-mapper/index.html b/docs/docs/object-mapper/index.html index 1c96a4a9052..27013419de9 100644 --- a/docs/docs/object-mapper/index.html +++ b/docs/docs/object-mapper/index.html @@ -6,7 +6,7 @@ 12. 对象数据映射 | Fur - + @@ -15,14 +15,15 @@ - +

12. 对象数据映射

12.1 对象映射

简单来说,就是将一个对象的数据根据特定规则批量映射到另一个对象中,减少手工操作和降低人为出错率。如将 DTO 对象映射到 Entity 实体中,反之亦然。

12.2 先看例子

在过去,我们需要将一个对象的值转换到另一个对象中,我们需要这样做,如:

var entity = repository.Find(1);
-
var dto = new Dto();
dto.Id = entity.Id;
dto.Name = entity.Name;
dto.Age = entity.Age;
dto.Address = entity.Address;
dto.FullName = entity.FirstName + entity.LastName;
dto.IdCard = entity.IdCard.Replace("1234", "****");

上面的例子似乎没有任何问题,但是如果很多地方需要这样的赋值操作、或者相同的赋值操作在多个地方使用,又或者一个类中含有非常多的属性或自定义赋值操作。

那么这样的操作效率极低,容易出错,且代码非常臃肿和冗余。

所以,实现自动映射赋值和支持特殊配置的需求就有了。

目前 C# 平台有两个优秀的对象映射工具:MapsterAutoMapper,在 Fur 框架中,默认集成的是 MapsterMapster 是一款极易使用且超高性能的对象映射框架。

+
var dto = new Dto();
dto.Id = entity.Id;
dto.Name = entity.Name;
dto.Age = entity.Age;
dto.Address = entity.Address;
dto.FullName = entity.FirstName + entity.LastName;
dto.IdCard = entity.IdCard.Replace("1234", "****");

上面的例子似乎没有任何问题,但是如果很多地方需要这样的赋值操作、或者相同的赋值操作在多个地方使用,又或者一个类中含有非常多的属性或自定义赋值操作。那么这样的操作效率极低,容易出错,且代码非常臃肿和冗余。

所以,实现自动映射赋值和支持特殊配置的需求就有了。目前 C# 平台有两个优秀的对象映射工具:MapsterAutoMapperFur 框架中,默认集成的是 MapsterMapster 是一款极易使用且超高性能的对象映射框架。

12.3 Mapster 使用

现在,我们可以通过 Mapster 提供的对象映射方法:Adapt 方法改造上面的例子:

12.3.1 极易入门

var entity = repository.Find(1);
var dto = entity.Adapt<Dto>();

仅仅一行代码就可以实现 entity -> dto 的转换,如果涉及到赋值的复制操作,如 dto.FullNamedto.IdCard,我们只需要自定义映射规则类即可。

12.3.2 自定义映射规则

using Fur.ObjectMapper;
using Mapster;
using System;
+
namespace Fur.Application
{
public class Mapper : IObjectMapper
{
public void Register(TypeAdapterConfig config)
{
config.ForType<Entity, Dto>()
.Map(dest => dest.FullName, src => src.FirstName + src.LastName)
.Map(dest => dest.IdCard, src => src.IdCard.Replace("1234", "****"));
}
}
}
小知识

该映射文件 Mapper.cs 可以放在任何项目或文件夹中,Fur 会在程序启动的时候自动扫描并注入配置。

12.3.3 依赖注入方式

Mapster 除了提供 Adapt 拓展方法以外,同时还提供依赖注入的方式。

public class Person(IMapper mapper)
{
var dto = _mapper.Map<Dto>(entity);
}

12.3.4 和 EFCore 配合

Mapster 还提供了 ProjectToType Linq 拓展方法减少我们手动 Select 操作,如:

正常的操作:

var destinations = context.Sources
.Select(c => new Destination {
Id = p.Id,
Name = p.Name,
Surname = p.Surname,
....
})
.ToList();

使用 Mapster 之后:

var destinations = context.Sources.ProjectToType<Destination>().ToList();

12.4 反馈与建议

与我们交流

给 Fur 提 Issue


了解更多

想了解更多 Mapster 知识可查阅 Mapster - Wiki 文档。

- + @@ -31,6 +32,6 @@ - + \ No newline at end of file diff --git a/docs/docs/options/index.html b/docs/docs/options/index.html index b2e9f146f2e..2ed56e5be3b 100644 --- a/docs/docs/options/index.html +++ b/docs/docs/options/index.html @@ -6,7 +6,7 @@ 4.2 选项 | Fur - + @@ -33,7 +33,7 @@
public void OnListener(AppInfoOptions options, IConfiguration configuration)
{
var name = options.Name; // 实时的最新值
var version = options.Version; // 实时的最新值
}
public void PostConfigure(AppInfoOptions options, IConfiguration configuration)
{
}
}
特别说明

IConfigurableOptionsListener<TOptions> 继承自 IConfigurableOptions<TOptions>

4.2.10 选项的优缺点

  • 优点

    • 强类型配置
    • 提供多种读取方式
    • 支持热加载
    • 支持设置默认值/后期配置
    • 支持在运行环境中动态配置
    • 支持验证配置有效性
    • 支持更改通知
    • 支持命名选项
  • 缺点

    • 需要定义对应类型
    • 需要在启动时注册

4.2.11 反馈与建议

与我们交流

给 Fur 提 Issue


了解更多

想了解更多 选项 知识可查阅 ASP.NET Core - 选项 章节。

- + diff --git a/docs/docs/performance/index.html b/docs/docs/performance/index.html index 42ffdd97674..58b2bdcf0a0 100644 --- a/docs/docs/performance/index.html +++ b/docs/docs/performance/index.html @@ -6,7 +6,7 @@ 27.2 性能测试 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/docs/docs/process-service/index.html b/docs/docs/process-service/index.html index f0e636610bb..849406cf3f2 100644 --- a/docs/docs/process-service/index.html +++ b/docs/docs/process-service/index.html @@ -6,7 +6,7 @@ 21. 进程服务 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/docs/docs/reference/index.html b/docs/docs/reference/index.html index ea751b4fe7c..f1a4c880753 100644 --- a/docs/docs/reference/index.html +++ b/docs/docs/reference/index.html @@ -6,7 +6,7 @@ 1.4 项目引用 | Fur - + @@ -15,19 +15,15 @@ - +
-

1.4 项目引用

1.4.1 关于项目引用

Fur 框架默认采用多层项目设计架构,每一个项目层的依赖分别是:

  • Fur:核心层,无项目依赖
  • Fur.Application:添加 Fur.Core 引用
  • Fur.Core:添加 Fur 引用
  • Fur.Database.Migrations:添加 Fur.EntityFramework.Core 引用
  • Fur.EntityFramework.Core:添加 Fur.Core 引用
  • Fur.Web.Core:添加 Fur.ApplicationFur.Database.Migrations 引用
  • Fur.Web.Entry:添加 Fur.Web.Core 引用 和 Microsoft.EntityFrameworkCore.Tools

1.4.2 创建项目注意事项

Fur 框架采用最新的 .NET 5 共享包设计方式,所以,所有新建的 项目 都需要修改 .csproj 文件,并添加以下代码:

Fur.Core\Fur.Core.csproj
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>

完整代码如下:

<Project Sdk="Microsoft.NET.Sdk">
-
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<NoWarn>1701;1702;1591</NoWarn>
<DocumentationFile>Fur.Core.xml</DocumentationFile>
</PropertyGroup>
-
<ItemGroup>
<None Remove="Fur.Core.xml" />
</ItemGroup>
-
<ItemGroup>
<ProjectReference Include="..\Fur\Fur.csproj" />
</ItemGroup>
-
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
-
</Project>
-

所有新建项目都需添加 上述高亮代码,方可使用 Fur 全部功能。

1.4.3 反馈与建议

与我们交流

给 Fur 提 Issue

+

1.4 项目引用

1.4.1 关于项目引用

Fur 框架默认采用多层项目设计架构,每一个项目层的依赖分别是:

  • Fur:核心层,无项目依赖
  • Fur.Application:添加 Fur.Core 引用
  • Fur.Core:添加 Fur 引用
  • Fur.Database.Migrations:添加 Fur.EntityFramework.Core 引用
  • Fur.EntityFramework.Core:添加 Fur.Core 引用
  • Fur.Web.Core:添加 Fur.ApplicationFur.Database.Migrations 引用
  • Fur.Web.Entry:添加 Fur.Web.Core 引用 和 Microsoft.EntityFrameworkCore.Tools

如果开发者搭建自己的项目,则只需要在 Fur.Core 层引用 Nuget 中最新的 Fur 包即可。

1.4.2 集成 Fur 功能

项目搭建好之后,集成 Fur 框架只需要在 Program.cs 中 添加 Inject() 方法即可:

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
+
namespace Fur.Web.Entry
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
+
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.Inject()
.UseStartup<Startup>();
});
}
}
}

1.4.3 反馈与建议

与我们交流

给 Fur 提 Issue

- + @@ -36,6 +32,6 @@ - + \ No newline at end of file diff --git a/docs/docs/saas/index.html b/docs/docs/saas/index.html index 21e03a41985..d9fd42ff1e6 100644 --- a/docs/docs/saas/index.html +++ b/docs/docs/saas/index.html @@ -6,7 +6,7 @@ 10. SaaS 多租户 | Fur - + @@ -55,7 +55,7 @@
namespace Fur.EntityFramework.Core
{
[AppDbContext("Sqlite3ConnectionString")]
public class FurDbContext : AppDbContext<FurDbContext>, IMultiTenantOnSchema
{
public FurDbContext(DbContextOptions<FurDbContext> options) : base(options)
{
}
public string GetSchemaName()
{
return base.Tenant?.Schema;
}
}
}

10.7.6 关于 Code First 数据迁移

基于 Schema 方式比较特别,生成数据迁移的时候没办法获取租户信息,所以建议分开多次迁移,如:

public string GetSchemaName()
{
return base.Tenant?.Schema?? "租户一Schema";
}
public string GetSchemaName()
{
return base.Tenant?.Schema?? "租户二Schema";
}

这样就可以在迁移的时候生成多次迁移了。

10.8 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/signalr/index.html b/docs/docs/signalr/index.html index 6adac8defff..5b252bb4e63 100644 --- a/docs/docs/signalr/index.html +++ b/docs/docs/signalr/index.html @@ -6,7 +6,7 @@ 23. 即时通讯 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/docs/docs/source/index.html b/docs/docs/source/index.html index 4345d81181d..330fd132ce0 100644 --- a/docs/docs/source/index.html +++ b/docs/docs/source/index.html @@ -6,7 +6,7 @@ 1.3 源码结构 | Fur - + @@ -53,7 +53,7 @@
#prefer fields not to be prefaced with this. or Me. in Visual Basic
dotnet_style_qualification_for_field = false:suggestion
#prefer methods not to be prefaced with this. or Me. in Visual Basic
dotnet_style_qualification_for_method = false:suggestion
#prefer properties not to be prefaced with this. or Me. in Visual Basic
dotnet_style_qualification_for_property = false:suggestion
# Add file header
file_header_template = -----------------------------------------------------------------------------\nFur 是 .NET 5 平台下极易入门、极速开发的 Web 应用框架。\nCopyright © 2020 Fur, Baiqian Co.,Ltd.\n\n框架名称:Fur\n框架作者:百小僧\n框架版本:1.0.0\n源码地址:Gitee:https://gitee.com/monksoul/Fur \n Github:https://github.com/monksoul/Fur \n开源协议:Apache-2.0(http://www.apache.org/licenses/LICENSE-2.0)\n-----------------------------------------------------------------------------

1.2.4 Fur 核心层

Fur 核心层是 Fur 框架的中心,也是 Fur 能够支撑起来的必备层。

源码结构:

Fur
├─Fur.csproj
├─Fur.csproj.user
├─FurStartup.cs
├─ViewEngine
| ├─IViewEngine.cs
| ├─ViewEngine.cs
| ├─Templates
| | ├─IViewEngineCompiledTemplate.cs
| | ├─IViewEngineTemplate.cs
| | ├─ViewEngineCompiledTemplate.cs
| | └ViewEngineTemplate.cs
| ├─Options
| | └ViewEngineCompilationOptions.cs
| ├─Models
| | └AnonymousTypeWrapper.cs
| ├─Exceptions
| | ├─ViewEngineCompilationException.cs
| | └ViewEngineException.cs
| ├─Compilations
| | ├─IViewEngineCompilationOptionsBuilder.cs
| | └ViewEngineCompilationOptionsBuilder.cs
├─UnifyResult
| ├─Providers
| | ├─IUnifyResultProvider.cs
| | └RESTfulResultProvider.cs
| ├─Models
| | └RESTfulResult.cs
| ├─Filters
| | └SuccessUnifyResultFilter.cs
| ├─Extensions
| | └UnifyResultServiceCollectionExtensions.cs
├─SpecificationDocument
| ├─Options
| | └SpecificationDocumentSettingsOptions.cs
| ├─Models
| | ├─GroupOrder.cs
| | ├─SpecificationOpenApiInfo.cs
| | ├─SpecificationOpenApiSecurityRequirementItem.cs
| | └SpecificationOpenApiSecurityScheme.cs
| ├─Extensions
| | ├─SpecificationDocumentApplicationBuilderExtensions.cs
| | └SpecificationDocumentServiceCollectionExtensions.cs
| ├─Builders
| | └SpecificationDocumentBuilder.cs
| ├─Assets
| | └index-mini-profiler.html
├─ObjectMapper
| ├─Extensions
| | └ObjectMapperServiceCollectionExtensions.cs
| ├─Dependencies
| | └IObjectMapper.cs
├─LinqBuilder
| ├─Visitors
| | └ParameterReplaceExpressionVisitor.cs
| ├─Extensions
| | └LinqExtensions.cs
| ├─Builders
| | └LinqExpression.cs
├─FriendlyException
| ├─Oops.cs
| ├─Providers
| | └IErrorCodeTypeProvider.cs
| ├─Options
| | └ErrorCodeMessageSettingsOptions.cs
| ├─Models
| | └MethodIfException.cs
| ├─Filters
| | └FriendlyExceptionFilter.cs
| ├─Extensions
| | └FriendlyExceptionServiceCollectionExtensions.cs
| ├─Attributes
| | ├─ErrorCodeItemMetadataAttribute.cs
| | ├─ErrorCodeTypeAttribute.cs
| | └IfExceptionAttribute.cs
├─DynamicApiController
| ├─Penetrates.cs
| ├─Providers
| | └DynamicApiControllerFeatureProvider.cs
| ├─Options
| | └DynamicApiControllerSettingsOptions.cs
| ├─Models
| | └ParameterRouteTemplate.cs
| ├─Extensions
| | └DynamicApiControllerServiceCollectionExtensions.cs
| ├─Enums
| | └ApiSeats.cs
| ├─Dependencies
| | └IDynamicApiController.cs
| ├─Conventions
| | └DynamicApiControllerApplicationModelConvention.cs
| ├─Attributes
| | ├─ApiDescriptionSettingsAttribute.cs
| | ├─ApiSeatAttribute.cs
| | └DynamicApiControllerAttribute.cs
├─DependencyInjection
| ├─Options
| | └DependencyInjectionSettingsOptions.cs
| ├─Models
| | └ExternalService.cs
| ├─Extensions
| | └DependencyInjectionServiceCollectionExtensions.cs
| ├─Enums
| | ├─InjectionActions.cs
| | ├─InjectionPatterns.cs
| | └RegisterType.cs
| ├─Dependencies
| | ├─IPrivateDependency.cs
| | ├─IScoped.cs
| | ├─ISingleton.cs
| | ├─ITransient.cs
| | ├─Proxies
| | | └IDispatchProxy.cs
| ├─Attributes
| | ├─InjectionAttribute.cs
| | └SkipScanAttribute.cs
├─DataValidation
| ├─Validators
| | └DataValidator.cs
| ├─Providers
| | └IValidationMessageTypeProvider.cs
| ├─Options
| | └ValidationTypeMessageSettingsOptions.cs
| ├─Models
| | └DataValidationResult.cs
| ├─Filters
| | └DataValidationFilter.cs
| ├─Extensions
| | ├─DataValidationExtensions.cs
| | └DataValidationServiceCollectionExtensions.cs
| ├─Enums
| | ├─ValidationPattern.cs
| | └ValidationTypes.cs
| ├─Attributes
| | ├─DataValidationAttribute.cs
| | ├─NonValidationAttribute.cs
| | ├─ValidationItemMetadataAttribute.cs
| | ├─ValidationMessageAttribute.cs
| | ├─ValidationMessageTypeAttribute.cs
| | └ValidationTypeAttribute.cs
├─DataEncryption
| ├─AESEncryption.cs
| ├─DESCEncryption.cs
| └MD5Encryption.cs
├─DatabaseAccessor
| ├─UnitOfWork
| | ├─Filters
| | | └UnitOfWorkFilter.cs
| | ├─Attributes
| | | ├─NonTransactAttribute.cs
| | | └UnitOfWorkAttribute.cs
| ├─Repositories
| | ├─EFCoreRepository.cs
| | ├─IMSRepository.cs
| | ├─IRepository.cs
| | ├─ISqlRepository.cs
| | ├─MSRepository.cs
| | ├─SqlRepository.cs
| | ├─Implantations
| | | ├─DeletableRepository.cs
| | | ├─InsertableRepository.cs
| | | ├─OperableRepository.cs
| | | ├─ReadableRepository.cs
| | | ├─SqlExecutableRepository.cs
| | | ├─SqlReaderRepository.cs
| | | ├─UpdateableRepository.cs
| | | └WritableRepository.cs
| | ├─Dependencies
| | | ├─IDeletableRepository.cs
| | | ├─IInsertableRepository.cs
| | | ├─IOperableRepository.cs
| | | ├─IReadableRepository.cs
| | | ├─IRepositoryDependency.cs
| | | ├─ISqlExecutableRepository.cs
| | | ├─ISqlReaderRepository.cs
| | | ├─IUpdateableRepository.cs
| | | └IWritableRepository.cs
| ├─Pools
| | ├─DbContextPool.cs
| | └IDbContextPool.cs
| ├─MultiTenants
| | ├─Locators
| | | └MultiTenantDbContextLocator.cs
| | ├─Enums
| | | └MultiTenantOptions.cs
| | ├─Entities
| | | └Tenant.cs
| | ├─Dependencies
| | | ├─IMultiTenantOnDatabase.cs
| | | ├─IMultiTenantOnSchema.cs
| | | ├─IMultiTenantOnTable.cs
| | | └IPrivateMultiTenant.cs
| ├─Models
| | ├─DbProvider.cs
| | ├─PagedList.cs
| | ├─ProcedureOutputResult.cs
| | ├─ProcedureOutputValue.cs
| | ├─SqlTemplate.cs
| | └SqlTemplateParameter.cs
| ├─Locators
| | ├─IDbContextLocator.cs
| | └MasterDbContextLocator.cs
| ├─Interceptors
| | ├─DbContextSaveChangesInterceptor.cs
| | ├─SqlCommandProfilerInterceptor.cs
| | └SqlConnectionProfilerInterceptor.cs
| ├─Helpers
| | └DbHelpers.cs
| ├─Extensions
| | ├─DatabaseAccessorServiceCollectionExtensions.cs
| | ├─PagedQueryableExtensions.cs
| | ├─Repositories
| | | ├─IEntityExtensions.cs
| | | ├─IEntityWithDbContextLocatorExtensions.cs
| | | └SqlExtensions.cs
| | ├─DatabaseProvider
| | | ├─DatabaseProviderServiceCollectionExtensions.cs
| | | └Penetrates.cs
| | ├─DatabaseFacade
| | | ├─DbDataConvertExtensions.cs
| | | ├─DbObjectExtensions.cs
| | | └SqlAdoNetExtensions.cs
| ├─Enums
| | ├─DbFunctionType.cs
| | ├─EFCoreErrorCodes.cs
| | └ManualOptions.cs
| ├─Entities
| | ├─Dependencies
| | | ├─Entity.cs
| | | ├─EntityBase.cs
| | | ├─EntityNotKey.cs
| | | ├─IEntity.cs
| | | └IEntityNotKey.cs
| | ├─Configures
| | | ├─IEntitySeedData.cs
| | | ├─IEntityTypeBuilder.cs
| | | ├─IModelBuilderFilter.cs
| | | └IPrivateModelBuilder.cs
| | ├─Attributes
| | | ├─FakeDeleteAttribute.cs
| | | ├─NonAutomaticAttribute.cs
| | | └QueryableFunctionAttribute.cs
| ├─DynamicModels
| | ├─DynamicModelCacheKeyFactory.cs
| | └IEntityMutableTable.cs
| ├─Contexts
| | ├─AppDbContext.cs
| | ├─Builders
| | | ├─AppDbContextBuilder.cs
| | | ├─Models
| | | | └DbContextCorrelationType.cs
| | ├─Attributes
| | | └AppDbContextAttribute.cs
| ├─Attributes
| | └DbParameterAttribute.cs
| ├─Advances
| | ├─Proxies
| | | └SqlDispatchProxy.cs
| | ├─Models
| | | └SqlProxyMethod.cs
| | ├─Dependencies
| | | └ISqlDispatchProxy.cs
| | ├─Attributes
| | | ├─SqlExecuteAttribute.cs
| | | ├─SqlFunctionAttribute.cs
| | | ├─SqlProcedureAttribute.cs
| | | ├─Basics
| | | | ├─SqlObjectProxyAttribute.cs
| | | | ├─SqlProxyAttribute.cs
| | | | └SqlSentenceProxyAttribute.cs
├─CorsAccessor
| ├─Options
| | └CorsAccessorSettingsOptions.cs
| ├─Extensions
| | ├─CorsAccessorApplicationBuilderExtensions.cs
| | └CorsAccessorServiceCollectionExtensions.cs
├─ConfigurableOptions
| ├─Options
| | └IConfigurableOptions.cs
| ├─Extensions
| | └ConfigurableOptionsServiceCollectionExtensions.cs
| ├─Attributes
| | └OptionsSettingsAttribute.cs
├─Authorization
| ├─Penetrates.cs
| ├─Requirements
| | └AuthorizePolicyRequirement.cs
| ├─Providers
| | └AuthorizePolicyProvider.cs
| ├─Options
| | └JWTSettingsOptions.cs
| ├─Handlers
| | └AuthorizePolicyHandler.cs
| ├─Extensions
| | └PolicyAuthorizationServiceCollectionExtensions.cs
| ├─Attributes
| | └AuthorizePolicyAttribute.cs
├─App
| ├─App.cs
| ├─Startups
| | ├─AppStartup.cs
| | └HostingStartup.cs
| ├─Options
| | └AppSettingsOptions.cs
| ├─Filters
| | └StartupFilter.cs
| ├─Extensions
| | ├─AppApplicationBuilderExtensions.cs
| | ├─AppServiceCollectionExtensions.cs
| | ├─WebHostBuilderExtensions.cs
| | ├─Types
| | | └ObjectExtensions.cs
| ├─Attributes
| | └AppStartupAttribute.cs

1.2.5 Fur.Application 业务应用层

Fur.Application 业务应用层是最常用的层,几乎所有的业务代码都在这个层中编写。

源码结构:

Fur.Application
├─Fur.Application.Core.csproj
├─Fur.Application.Core.xml
└FurApplicationStartup.cs

1.2.6 Fur.Core 仓储实体层

Fur.Core 主要是存储自定义仓储和定义实体的层。

源码结构:

Fur.Core
├─Fur.Core.csproj
└FurCoreStartup.cs

1.2.7 Fur.Database.Migrations 数据库架构维护层

Fur.Database.Migrations 主要是用来存放 Database FirstCode First 生成的维护文件。

源码结构:

Fur.Database.Migrations
└Fur.Database.Migrations.csproj

1.2.8 Fur.EntityFramework.Core 数据库上下文配置层

Fur.EntityFramework.Core 主要是用来配置数据库上下文和其他数据库相关配置信息的。

源码结构:

Fur.EntityFramework.Core
└Fur.EntityFramework.Core.csproj

1.2.9 Fur.Web.Core 应用核心层

Fur.Web.Core 主要是用来配置 Web 入口一些代码,如 FilterMiddlewares 等。

源码结构:

Fur.Web.Core
├─Fur.Web.Core.xml
└FurWebCoreStartup.cs

1.2.10 Fur.Web.Entry 应用入口层

Fur.Web.Entry 是我们的应用层,也就是我们的 Web 项目层,发布层。

源码结构:

Fur.Web.Entry
├─appsettings.Development.json
├─appsettings.json
├─Fur.Web.Entry.csproj
├─Fur.Web.Entry.csproj.user
├─Fur.Web.Entry.xml
├─Program.cs
├─Startup.cs
├─wwwroot
| └README.md
├─Properties
| └launchSettings.json
├─Controllers
- + diff --git a/docs/docs/specification-document/index.html b/docs/docs/specification-document/index.html index b7e4b078665..1c947c12ce7 100644 --- a/docs/docs/specification-document/index.html +++ b/docs/docs/specification-document/index.html @@ -6,7 +6,7 @@ 6. 规范化接口文档 | Fur - + @@ -48,7 +48,7 @@
return new JsonResult(new RESTfulResult
{
StatusCode = context.Result is EmptyResult ? StatusCodes.Status204NoContent : StatusCodes.Status200OK,
Successed = true,
Data = data,
Errors = null
});
}
/// <summary>
/// 验证失败返回值
/// </summary>
/// <param name="context"></param>
/// <param name="modelStates"></param>
/// <param name="validationResults"></param>
/// <param name="validateFaildMessage"></param>
/// <returns></returns>
public IActionResult OnValidateFailed(ActionExecutingContext context, ModelStateDictionary modelStates, Dictionary<string, IEnumerable<string>> validationResults, string validateFaildMessage)
{
return new JsonResult(new RESTfulResult
{
StatusCode = StatusCodes.Status400BadRequest,
Successed = false,
Data = null,
Errors = validationResults
});
}
}
}

之后在 Startup.cs 中注册即可:

services.AddControllers().AddUnifyResult<RESTfulResult, RESTfulResultProvider>();

6.8 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/split-db/index.html b/docs/docs/split-db/index.html index 83df14778ef..7c2876048fd 100644 --- a/docs/docs/split-db/index.html +++ b/docs/docs/split-db/index.html @@ -6,7 +6,7 @@ 9.27 分表分库 | Fur - + @@ -25,7 +25,7 @@
// 通过数据库上下文定位器切换
repository.Change<Entity, MyDbContextLocator2>();

如需跨库查询,需用到数据库技术,如 SqlServer 链接服务器或同义词。

  • 动态切换数据库表
// 直接改变表,会有多线程操作bug,同时无法刷新模型
repository.ChangeTable("数据库表");
// 创建新的 DbContext,然后刷新 OnModelCreating(推荐方式)
var dynamicDbContextResolve = App.TransientServices.GetService<Func<Type, IScoped, DbContext>>();
var dynamicDbContext = dynamicDbContextResolve(typeof(MyDbContextLocator), default);
// 重新调用 OnModelCreating,在 OnModelCreating 中配置 ToTable("动态表") 即可。
DynamicModelCacheKeyFactory.RebuildModels();
var persons= dynamicDbContext.Set<Person>();
persons.Add(new Person{});
了解更多

想了解更多 DynamicModelCacheKeyFactory 知识可查阅 EF Core - 多个模型之间交替 章节。

9.27.7 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/docs/docs/tran/index.html b/docs/docs/tran/index.html index cf321d1b20b..2a6cd51dd8b 100644 --- a/docs/docs/tran/index.html +++ b/docs/docs/tran/index.html @@ -6,7 +6,7 @@ 9.25 事务和工作单元 | Fur - + @@ -24,7 +24,7 @@
var blogs = _testRepository.Entity
.OrderBy(b => b.Url)
.ToList();
// 提交事务
transaction.Commit();
}
catch (Exception)
{
// 回滚事务
transaction.RollBack();
}
}

9.25.4 工作单元特性说明

9.25.4.1 [UnitOfWork]

[UnitOfWork] 特性用来标记事务信息,如作用范围,隔离级别等。

  • Enabled:是否启动工作单元,默认 true
  • ScopeOption:定义事务范围行为,默认 TransactionScopeOption.Required
  • IsolationLevel:设置事务隔离级别,默认 IsolationLevel.ReadCommitted;
  • AsyncFlowOption:允许跨线程连续任务的事务流,如有异步操作需开启该选项,默认开启
特别注意

一旦方法贴了 [UnitOfWork(false)] 特性后,那么该方法不再启用工作单元模式,也就是不包含事务,也不会自动提交数据库。慎用!

9.25.4.2 [NonTransact]

一但方法或类贴了 [NonTransact] 特性,那么将关闭事务操作,但是还是会自动保存数据库到数据。

9.25.5 常见错误

  • A TransactionScope must be disposed on the same thread that it was created.

只需要在当前操作方法上贴 [NonTransact] 特性即可。

9.25.6 反馈与建议

与我们交流

给 Fur 提 Issue


了解更多

想了解更多 事务 知识可查阅 EF Core - 使用事务 章节。

- + diff --git a/docs/docs/unittest/index.html b/docs/docs/unittest/index.html index 2e7c2e0b3d2..17cca8a0643 100644 --- a/docs/docs/unittest/index.html +++ b/docs/docs/unittest/index.html @@ -6,7 +6,7 @@ 27.1 单元测试 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/docs/docs/view-engine/index.html b/docs/docs/view-engine/index.html index 8f4c0367eda..e0581c408c6 100644 --- a/docs/docs/view-engine/index.html +++ b/docs/docs/view-engine/index.html @@ -6,7 +6,7 @@ 17. 视图引擎 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/docs/index.html b/docs/index.html index 81b66cf62a4..ddf8d955fea 100644 --- a/docs/index.html +++ b/docs/index.html @@ -6,7 +6,7 @@ Fur 是 .NET 5 平台下极易入门、极速开发的 Web 应用框架。 Fur | Fur - + @@ -16,7 +16,7 @@

Fur 是 .NET 5 平台下极易入门、极速开发的 Web 应用框架。

[object Object]

.NET 5 新起点

.NET 5 是 .NET 的重要且令人兴奋的新方向。你会看到 .NET 变得更加简单,但也有更广泛的功能和实用程序。所有新的开发和功能都将是 .NET 5 的一部分,包括新的 C# 版本

[object Object]

“六级” 架构

Fur 在设计之初就秉承着 “六极” :极易入门、极速开发、极少依赖、极少配置、极其灵活、极易维护 的设计思想,在架构设计上做了大量的优化,支持各个能力阶层技术员极速上手。

[object Object]

冲一杯咖啡的时间

Fur 除了独具创新的设计理念和灵活的架构设计以外,同时还结合了主流的敏捷开发模式打造的一款极速开发框架。只需冲制一杯咖啡的时间便可完成工作

- + diff --git a/docs/runtime~main.c11cdd7c.js b/docs/runtime~main.578a6a35.js similarity index 95% rename from docs/runtime~main.c11cdd7c.js rename to docs/runtime~main.578a6a35.js index f54f89119ba..d2c9ed527df 100644 --- a/docs/runtime~main.c11cdd7c.js +++ b/docs/runtime~main.578a6a35.js @@ -1 +1 @@ -!function(e){function a(a){for(var c,r,t=a[0],n=a[1],o=a[2],u=0,l=[];u - - - - diff --git a/framework/Fur.Application/Persons/PersonRelationshipService.cs b/framework/Fur.Application/Persons/PersonRelationshipService.cs index 581615aeb97..380a0596ddb 100644 --- a/framework/Fur.Application/Persons/PersonRelationshipService.cs +++ b/framework/Fur.Application/Persons/PersonRelationshipService.cs @@ -12,7 +12,6 @@ namespace Fur.Application.Persons /// /// 关联数据演示 /// - [ApiDescriptionSettings("Demo")] public class PersonRelationshipService : IDynamicApiController { private readonly IReadableRepository _readableRepository; diff --git a/framework/Fur.Application/Persons/PersonService.cs b/framework/Fur.Application/Persons/PersonService.cs index f0ee91ea259..d4b60eb7aba 100644 --- a/framework/Fur.Application/Persons/PersonService.cs +++ b/framework/Fur.Application/Persons/PersonService.cs @@ -20,7 +20,6 @@ namespace Fur.Application /// /// 用户管理 /// - [ApiDescriptionSettings("Demo")] public class PersonService : IDynamicApiController { private readonly IHttpContextAccessor _httpContextAccessor; diff --git a/framework/Fur.Application/applicationsettings.json b/framework/Fur.Application/applicationsettings.json index 7b0602d48e4..4237d47301d 100644 --- a/framework/Fur.Application/applicationsettings.json +++ b/framework/Fur.Application/applicationsettings.json @@ -1,11 +1,10 @@ { "AppSettings": { "SpecificationDocumentSettings": { - "RoutePrefix": "api", "DocumentTitle": "Fur | 数据库操作演示", "GroupOpenApiInfos": [ { - "Group": "Demo", + "Group": "Default", "Title": "数据库操作演示", "Description": "这里列举了常见数据库操作方法,方便大家学习。", "Version": "1.0.0", diff --git a/framework/Fur.Core/Fur.Core.csproj b/framework/Fur.Core/Fur.Core.csproj index 4f7bdfefe84..53513557c8a 100644 --- a/framework/Fur.Core/Fur.Core.csproj +++ b/framework/Fur.Core/Fur.Core.csproj @@ -15,11 +15,7 @@ - - - - - + diff --git a/framework/Fur.Database.Migrations/Fur.Database.Migrations.csproj b/framework/Fur.Database.Migrations/Fur.Database.Migrations.csproj index 131270ba649..c570732cb92 100644 --- a/framework/Fur.Database.Migrations/Fur.Database.Migrations.csproj +++ b/framework/Fur.Database.Migrations/Fur.Database.Migrations.csproj @@ -4,10 +4,6 @@ net5.0 - - - - diff --git a/framework/Fur.EntityFramework.Core/Fur.EntityFramework.Core.csproj b/framework/Fur.EntityFramework.Core/Fur.EntityFramework.Core.csproj index a16304030e4..c8caf4a808f 100644 --- a/framework/Fur.EntityFramework.Core/Fur.EntityFramework.Core.csproj +++ b/framework/Fur.EntityFramework.Core/Fur.EntityFramework.Core.csproj @@ -18,11 +18,7 @@ - - - - - + diff --git a/framework/Fur.Web.Core/Fur.Web.Core.csproj b/framework/Fur.Web.Core/Fur.Web.Core.csproj index d0ae993cf23..891295e3fa8 100644 --- a/framework/Fur.Web.Core/Fur.Web.Core.csproj +++ b/framework/Fur.Web.Core/Fur.Web.Core.csproj @@ -15,8 +15,4 @@ - - - - diff --git a/framework/Fur.Web.Entry/Fur.Web.Entry.csproj b/framework/Fur.Web.Entry/Fur.Web.Entry.csproj index 5afef303885..a60279aa7b4 100644 --- a/framework/Fur.Web.Entry/Fur.Web.Entry.csproj +++ b/framework/Fur.Web.Entry/Fur.Web.Entry.csproj @@ -16,7 +16,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/framework/Fur/App/App.cs b/framework/Fur/App/App.cs index 3630046d4e9..7fe644a7537 100644 --- a/framework/Fur/App/App.cs +++ b/framework/Fur/App/App.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/App/Attributes/AppStartupAttribute.cs b/framework/Fur/App/Attributes/AppStartupAttribute.cs index 194286f968d..f206662d3c3 100644 --- a/framework/Fur/App/Attributes/AppStartupAttribute.cs +++ b/framework/Fur/App/Attributes/AppStartupAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/App/Extensions/AppApplicationBuilderExtensions.cs b/framework/Fur/App/Extensions/AppApplicationBuilderExtensions.cs index 3f660d92811..40eafa88a63 100644 --- a/framework/Fur/App/Extensions/AppApplicationBuilderExtensions.cs +++ b/framework/Fur/App/Extensions/AppApplicationBuilderExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/App/Extensions/AppServiceCollectionExtensions.cs b/framework/Fur/App/Extensions/AppServiceCollectionExtensions.cs index d7e433bedcb..c53541736a4 100644 --- a/framework/Fur/App/Extensions/AppServiceCollectionExtensions.cs +++ b/framework/Fur/App/Extensions/AppServiceCollectionExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/App/Extensions/Types/ObjectExtensions.cs b/framework/Fur/App/Extensions/Types/ObjectExtensions.cs index 7a434a4bcc0..54fbbe98846 100644 --- a/framework/Fur/App/Extensions/Types/ObjectExtensions.cs +++ b/framework/Fur/App/Extensions/Types/ObjectExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/App/Extensions/WebHostBuilderExtensions.cs b/framework/Fur/App/Extensions/WebHostBuilderExtensions.cs index 4d06c6ff0ea..54c1021facd 100644 --- a/framework/Fur/App/Extensions/WebHostBuilderExtensions.cs +++ b/framework/Fur/App/Extensions/WebHostBuilderExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/App/Filters/StartupFilter.cs b/framework/Fur/App/Filters/StartupFilter.cs index e2631fa0ab9..93af1dc3ceb 100644 --- a/framework/Fur/App/Filters/StartupFilter.cs +++ b/framework/Fur/App/Filters/StartupFilter.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/App/Options/AppSettingsOptions.cs b/framework/Fur/App/Options/AppSettingsOptions.cs index 88e83d475da..8bac70a660e 100644 --- a/framework/Fur/App/Options/AppSettingsOptions.cs +++ b/framework/Fur/App/Options/AppSettingsOptions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/App/Proxies/IDispatchProxy.cs b/framework/Fur/App/Proxies/IDispatchProxy.cs index 38d728a79fb..ac2d2fc5b5d 100644 --- a/framework/Fur/App/Proxies/IDispatchProxy.cs +++ b/framework/Fur/App/Proxies/IDispatchProxy.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/App/Startups/AppStartup.cs b/framework/Fur/App/Startups/AppStartup.cs index e9fa31d0241..a094bda9c39 100644 --- a/framework/Fur/App/Startups/AppStartup.cs +++ b/framework/Fur/App/Startups/AppStartup.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/App/Startups/HostingStartup.cs b/framework/Fur/App/Startups/HostingStartup.cs index 0f60d96ebae..3b9a9055e3e 100644 --- a/framework/Fur/App/Startups/HostingStartup.cs +++ b/framework/Fur/App/Startups/HostingStartup.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/Authorization/Attributes/AuthorizePolicyAttribute.cs b/framework/Fur/Authorization/Attributes/AuthorizePolicyAttribute.cs index cb4d7a9772f..7586f86f335 100644 --- a/framework/Fur/Authorization/Attributes/AuthorizePolicyAttribute.cs +++ b/framework/Fur/Authorization/Attributes/AuthorizePolicyAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/Authorization/Extensions/PolicyAuthorizationServiceCollectionExtensions.cs b/framework/Fur/Authorization/Extensions/PolicyAuthorizationServiceCollectionExtensions.cs index 07f7cbc5b11..71a67826b3a 100644 --- a/framework/Fur/Authorization/Extensions/PolicyAuthorizationServiceCollectionExtensions.cs +++ b/framework/Fur/Authorization/Extensions/PolicyAuthorizationServiceCollectionExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/Authorization/Handlers/AuthorizePolicyHandler.cs b/framework/Fur/Authorization/Handlers/AuthorizePolicyHandler.cs index 2dbe09208f6..473b908c4a5 100644 --- a/framework/Fur/Authorization/Handlers/AuthorizePolicyHandler.cs +++ b/framework/Fur/Authorization/Handlers/AuthorizePolicyHandler.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/Authorization/Options/JWTSettingsOptions.cs b/framework/Fur/Authorization/Options/JWTSettingsOptions.cs index ed8a6d58285..3a94a2fb348 100644 --- a/framework/Fur/Authorization/Options/JWTSettingsOptions.cs +++ b/framework/Fur/Authorization/Options/JWTSettingsOptions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/Authorization/Penetrates.cs b/framework/Fur/Authorization/Penetrates.cs index ca9d809f270..2155d9c0da9 100644 --- a/framework/Fur/Authorization/Penetrates.cs +++ b/framework/Fur/Authorization/Penetrates.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/Authorization/Providers/AuthorizePolicyProvider.cs b/framework/Fur/Authorization/Providers/AuthorizePolicyProvider.cs index b562a05f903..df303c2a6f7 100644 --- a/framework/Fur/Authorization/Providers/AuthorizePolicyProvider.cs +++ b/framework/Fur/Authorization/Providers/AuthorizePolicyProvider.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/Authorization/Requirements/AuthorizePolicyRequirement.cs b/framework/Fur/Authorization/Requirements/AuthorizePolicyRequirement.cs index a16756839b8..8a172aa87b9 100644 --- a/framework/Fur/Authorization/Requirements/AuthorizePolicyRequirement.cs +++ b/framework/Fur/Authorization/Requirements/AuthorizePolicyRequirement.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/ConfigurableOptions/Attributes/OptionsSettingsAttribute.cs b/framework/Fur/ConfigurableOptions/Attributes/OptionsSettingsAttribute.cs index aa4294da0fd..65ce70b42c0 100644 --- a/framework/Fur/ConfigurableOptions/Attributes/OptionsSettingsAttribute.cs +++ b/framework/Fur/ConfigurableOptions/Attributes/OptionsSettingsAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/ConfigurableOptions/Extensions/ConfigurableOptionsServiceCollectionExtensions.cs b/framework/Fur/ConfigurableOptions/Extensions/ConfigurableOptionsServiceCollectionExtensions.cs index 86cb81c4a43..ce5d5b9034f 100644 --- a/framework/Fur/ConfigurableOptions/Extensions/ConfigurableOptionsServiceCollectionExtensions.cs +++ b/framework/Fur/ConfigurableOptions/Extensions/ConfigurableOptionsServiceCollectionExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/ConfigurableOptions/Options/IConfigurableOptions.cs b/framework/Fur/ConfigurableOptions/Options/IConfigurableOptions.cs index 57fc841d0ef..6e845e0ad80 100644 --- a/framework/Fur/ConfigurableOptions/Options/IConfigurableOptions.cs +++ b/framework/Fur/ConfigurableOptions/Options/IConfigurableOptions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/CorsAccessor/Extensions/CorsAccessorApplicationBuilderExtensions.cs b/framework/Fur/CorsAccessor/Extensions/CorsAccessorApplicationBuilderExtensions.cs index 60049c4c209..2d03468606e 100644 --- a/framework/Fur/CorsAccessor/Extensions/CorsAccessorApplicationBuilderExtensions.cs +++ b/framework/Fur/CorsAccessor/Extensions/CorsAccessorApplicationBuilderExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/CorsAccessor/Extensions/CorsAccessorServiceCollectionExtensions.cs b/framework/Fur/CorsAccessor/Extensions/CorsAccessorServiceCollectionExtensions.cs index 938a06302d2..0ba0b8e4bed 100644 --- a/framework/Fur/CorsAccessor/Extensions/CorsAccessorServiceCollectionExtensions.cs +++ b/framework/Fur/CorsAccessor/Extensions/CorsAccessorServiceCollectionExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/CorsAccessor/Options/CorsAccessorSettingsOptions.cs b/framework/Fur/CorsAccessor/Options/CorsAccessorSettingsOptions.cs index de496070528..b99b3455ea6 100644 --- a/framework/Fur/CorsAccessor/Options/CorsAccessorSettingsOptions.cs +++ b/framework/Fur/CorsAccessor/Options/CorsAccessorSettingsOptions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DataEncryption/AESEncryption.cs b/framework/Fur/DataEncryption/AESEncryption.cs index b8da440db07..fb81b149ada 100644 --- a/framework/Fur/DataEncryption/AESEncryption.cs +++ b/framework/Fur/DataEncryption/AESEncryption.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DataEncryption/DESCEncryption.cs b/framework/Fur/DataEncryption/DESCEncryption.cs index 45bb47a51e7..a9297a4ce77 100644 --- a/framework/Fur/DataEncryption/DESCEncryption.cs +++ b/framework/Fur/DataEncryption/DESCEncryption.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DataEncryption/MD5Encryption.cs b/framework/Fur/DataEncryption/MD5Encryption.cs index 23b507b397e..2016533f822 100644 --- a/framework/Fur/DataEncryption/MD5Encryption.cs +++ b/framework/Fur/DataEncryption/MD5Encryption.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DataValidation/Attributes/DataValidationAttribute.cs b/framework/Fur/DataValidation/Attributes/DataValidationAttribute.cs index b580d22aaf0..24477ef0a6f 100644 --- a/framework/Fur/DataValidation/Attributes/DataValidationAttribute.cs +++ b/framework/Fur/DataValidation/Attributes/DataValidationAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DataValidation/Attributes/NonValidationAttribute.cs b/framework/Fur/DataValidation/Attributes/NonValidationAttribute.cs index b300e1906cf..2b979fae81a 100644 --- a/framework/Fur/DataValidation/Attributes/NonValidationAttribute.cs +++ b/framework/Fur/DataValidation/Attributes/NonValidationAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DataValidation/Attributes/ValidationItemMetadataAttribute.cs b/framework/Fur/DataValidation/Attributes/ValidationItemMetadataAttribute.cs index 86ab12e0baf..0add9b4c81d 100644 --- a/framework/Fur/DataValidation/Attributes/ValidationItemMetadataAttribute.cs +++ b/framework/Fur/DataValidation/Attributes/ValidationItemMetadataAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DataValidation/Attributes/ValidationMessageAttribute.cs b/framework/Fur/DataValidation/Attributes/ValidationMessageAttribute.cs index 2a1ecc9bff3..f793221be99 100644 --- a/framework/Fur/DataValidation/Attributes/ValidationMessageAttribute.cs +++ b/framework/Fur/DataValidation/Attributes/ValidationMessageAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DataValidation/Attributes/ValidationMessageTypeAttribute.cs b/framework/Fur/DataValidation/Attributes/ValidationMessageTypeAttribute.cs index abc6d423dcf..e70c835824b 100644 --- a/framework/Fur/DataValidation/Attributes/ValidationMessageTypeAttribute.cs +++ b/framework/Fur/DataValidation/Attributes/ValidationMessageTypeAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DataValidation/Attributes/ValidationTypeAttribute.cs b/framework/Fur/DataValidation/Attributes/ValidationTypeAttribute.cs index d798a5bdc6b..a13f4dffa2a 100644 --- a/framework/Fur/DataValidation/Attributes/ValidationTypeAttribute.cs +++ b/framework/Fur/DataValidation/Attributes/ValidationTypeAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DataValidation/Enums/ValidationPattern.cs b/framework/Fur/DataValidation/Enums/ValidationPattern.cs index 9f66ca30273..d95a9899b9b 100644 --- a/framework/Fur/DataValidation/Enums/ValidationPattern.cs +++ b/framework/Fur/DataValidation/Enums/ValidationPattern.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DataValidation/Enums/ValidationTypes.cs b/framework/Fur/DataValidation/Enums/ValidationTypes.cs index 06fe0e3bd1a..9f991e862f8 100644 --- a/framework/Fur/DataValidation/Enums/ValidationTypes.cs +++ b/framework/Fur/DataValidation/Enums/ValidationTypes.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DataValidation/Extensions/DataValidationExtensions.cs b/framework/Fur/DataValidation/Extensions/DataValidationExtensions.cs index bace23ca596..c7887be46d7 100644 --- a/framework/Fur/DataValidation/Extensions/DataValidationExtensions.cs +++ b/framework/Fur/DataValidation/Extensions/DataValidationExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DataValidation/Extensions/DataValidationServiceCollectionExtensions.cs b/framework/Fur/DataValidation/Extensions/DataValidationServiceCollectionExtensions.cs index 6cb319416ec..aa3ad0e4652 100644 --- a/framework/Fur/DataValidation/Extensions/DataValidationServiceCollectionExtensions.cs +++ b/framework/Fur/DataValidation/Extensions/DataValidationServiceCollectionExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DataValidation/Filters/DataValidationFilter.cs b/framework/Fur/DataValidation/Filters/DataValidationFilter.cs index 37a945051fb..343ac56b8da 100644 --- a/framework/Fur/DataValidation/Filters/DataValidationFilter.cs +++ b/framework/Fur/DataValidation/Filters/DataValidationFilter.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DataValidation/Models/DataValidationResult.cs b/framework/Fur/DataValidation/Models/DataValidationResult.cs index 163510c53a1..d6a085be851 100644 --- a/framework/Fur/DataValidation/Models/DataValidationResult.cs +++ b/framework/Fur/DataValidation/Models/DataValidationResult.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DataValidation/Options/ValidationTypeMessageSettingsOptions.cs b/framework/Fur/DataValidation/Options/ValidationTypeMessageSettingsOptions.cs index 6769d8b9305..b9749a9f8b3 100644 --- a/framework/Fur/DataValidation/Options/ValidationTypeMessageSettingsOptions.cs +++ b/framework/Fur/DataValidation/Options/ValidationTypeMessageSettingsOptions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DataValidation/Providers/IValidationMessageTypeProvider.cs b/framework/Fur/DataValidation/Providers/IValidationMessageTypeProvider.cs index a8162cd509a..2bd68747a8d 100644 --- a/framework/Fur/DataValidation/Providers/IValidationMessageTypeProvider.cs +++ b/framework/Fur/DataValidation/Providers/IValidationMessageTypeProvider.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DataValidation/Validators/DataValidator.cs b/framework/Fur/DataValidation/Validators/DataValidator.cs index 9aacbf5264f..9b18f4918ce 100644 --- a/framework/Fur/DataValidation/Validators/DataValidator.cs +++ b/framework/Fur/DataValidation/Validators/DataValidator.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Advances/Attributes/Basics/SqlObjectProxyAttribute.cs b/framework/Fur/DatabaseAccessor/Advances/Attributes/Basics/SqlObjectProxyAttribute.cs index 2b5b9b3042d..e5a18ec58ff 100644 --- a/framework/Fur/DatabaseAccessor/Advances/Attributes/Basics/SqlObjectProxyAttribute.cs +++ b/framework/Fur/DatabaseAccessor/Advances/Attributes/Basics/SqlObjectProxyAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Advances/Attributes/Basics/SqlProxyAttribute.cs b/framework/Fur/DatabaseAccessor/Advances/Attributes/Basics/SqlProxyAttribute.cs index b927d61874d..a241e46184f 100644 --- a/framework/Fur/DatabaseAccessor/Advances/Attributes/Basics/SqlProxyAttribute.cs +++ b/framework/Fur/DatabaseAccessor/Advances/Attributes/Basics/SqlProxyAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Advances/Attributes/Basics/SqlSentenceProxyAttribute.cs b/framework/Fur/DatabaseAccessor/Advances/Attributes/Basics/SqlSentenceProxyAttribute.cs index cdc4ad7437a..b754a697281 100644 --- a/framework/Fur/DatabaseAccessor/Advances/Attributes/Basics/SqlSentenceProxyAttribute.cs +++ b/framework/Fur/DatabaseAccessor/Advances/Attributes/Basics/SqlSentenceProxyAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Advances/Attributes/SqlExecuteAttribute.cs b/framework/Fur/DatabaseAccessor/Advances/Attributes/SqlExecuteAttribute.cs index 61827852edd..4beca875b2f 100644 --- a/framework/Fur/DatabaseAccessor/Advances/Attributes/SqlExecuteAttribute.cs +++ b/framework/Fur/DatabaseAccessor/Advances/Attributes/SqlExecuteAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Advances/Attributes/SqlFunctionAttribute.cs b/framework/Fur/DatabaseAccessor/Advances/Attributes/SqlFunctionAttribute.cs index 39ee1dca654..e7fd20eb29b 100644 --- a/framework/Fur/DatabaseAccessor/Advances/Attributes/SqlFunctionAttribute.cs +++ b/framework/Fur/DatabaseAccessor/Advances/Attributes/SqlFunctionAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Advances/Attributes/SqlProcedureAttribute.cs b/framework/Fur/DatabaseAccessor/Advances/Attributes/SqlProcedureAttribute.cs index 18974704f8c..6ecb4109b8c 100644 --- a/framework/Fur/DatabaseAccessor/Advances/Attributes/SqlProcedureAttribute.cs +++ b/framework/Fur/DatabaseAccessor/Advances/Attributes/SqlProcedureAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Advances/Dependencies/ISqlDispatchProxy.cs b/framework/Fur/DatabaseAccessor/Advances/Dependencies/ISqlDispatchProxy.cs index 60e6812e37b..1684431b341 100644 --- a/framework/Fur/DatabaseAccessor/Advances/Dependencies/ISqlDispatchProxy.cs +++ b/framework/Fur/DatabaseAccessor/Advances/Dependencies/ISqlDispatchProxy.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Advances/Models/SqlProxyMethod.cs b/framework/Fur/DatabaseAccessor/Advances/Models/SqlProxyMethod.cs index c4e8aa8766f..956bda74952 100644 --- a/framework/Fur/DatabaseAccessor/Advances/Models/SqlProxyMethod.cs +++ b/framework/Fur/DatabaseAccessor/Advances/Models/SqlProxyMethod.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Advances/Proxies/SqlDispatchProxy.cs b/framework/Fur/DatabaseAccessor/Advances/Proxies/SqlDispatchProxy.cs index bcef6a2e2f9..37447743f65 100644 --- a/framework/Fur/DatabaseAccessor/Advances/Proxies/SqlDispatchProxy.cs +++ b/framework/Fur/DatabaseAccessor/Advances/Proxies/SqlDispatchProxy.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Attributes/DbParameterAttribute.cs b/framework/Fur/DatabaseAccessor/Attributes/DbParameterAttribute.cs index dda51d8782a..87bf78bbed7 100644 --- a/framework/Fur/DatabaseAccessor/Attributes/DbParameterAttribute.cs +++ b/framework/Fur/DatabaseAccessor/Attributes/DbParameterAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Contexts/AppDbContext.cs b/framework/Fur/DatabaseAccessor/Contexts/AppDbContext.cs index c05d7cefb52..5e581c9226c 100644 --- a/framework/Fur/DatabaseAccessor/Contexts/AppDbContext.cs +++ b/framework/Fur/DatabaseAccessor/Contexts/AppDbContext.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Contexts/Attributes/AppDbContextAttribute.cs b/framework/Fur/DatabaseAccessor/Contexts/Attributes/AppDbContextAttribute.cs index 3c62e7b3181..e2206ab9ffd 100644 --- a/framework/Fur/DatabaseAccessor/Contexts/Attributes/AppDbContextAttribute.cs +++ b/framework/Fur/DatabaseAccessor/Contexts/Attributes/AppDbContextAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Contexts/Builders/AppDbContextBuilder.cs b/framework/Fur/DatabaseAccessor/Contexts/Builders/AppDbContextBuilder.cs index d2ea8982ca8..3c9b804343f 100644 --- a/framework/Fur/DatabaseAccessor/Contexts/Builders/AppDbContextBuilder.cs +++ b/framework/Fur/DatabaseAccessor/Contexts/Builders/AppDbContextBuilder.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Contexts/Builders/Models/DbContextCorrelationType.cs b/framework/Fur/DatabaseAccessor/Contexts/Builders/Models/DbContextCorrelationType.cs index dc8395398f4..08a1c0d96c4 100644 --- a/framework/Fur/DatabaseAccessor/Contexts/Builders/Models/DbContextCorrelationType.cs +++ b/framework/Fur/DatabaseAccessor/Contexts/Builders/Models/DbContextCorrelationType.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Db.cs b/framework/Fur/DatabaseAccessor/Db.cs index 139fa36b528..f1e22d0f4cd 100644 --- a/framework/Fur/DatabaseAccessor/Db.cs +++ b/framework/Fur/DatabaseAccessor/Db.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/DynamicModels/DynamicModelCacheKeyFactory.cs b/framework/Fur/DatabaseAccessor/DynamicModels/DynamicModelCacheKeyFactory.cs index ab2adeff141..76ed408b732 100644 --- a/framework/Fur/DatabaseAccessor/DynamicModels/DynamicModelCacheKeyFactory.cs +++ b/framework/Fur/DatabaseAccessor/DynamicModels/DynamicModelCacheKeyFactory.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/DynamicModels/IEntityMutableTable.cs b/framework/Fur/DatabaseAccessor/DynamicModels/IEntityMutableTable.cs index 025c4ae2549..00d27d2aa73 100644 --- a/framework/Fur/DatabaseAccessor/DynamicModels/IEntityMutableTable.cs +++ b/framework/Fur/DatabaseAccessor/DynamicModels/IEntityMutableTable.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Entities/Attributes/FakeDeleteAttribute.cs b/framework/Fur/DatabaseAccessor/Entities/Attributes/FakeDeleteAttribute.cs index 08a1dcde6e0..f984e33f1ae 100644 --- a/framework/Fur/DatabaseAccessor/Entities/Attributes/FakeDeleteAttribute.cs +++ b/framework/Fur/DatabaseAccessor/Entities/Attributes/FakeDeleteAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Entities/Attributes/NonAutomaticAttribute.cs b/framework/Fur/DatabaseAccessor/Entities/Attributes/NonAutomaticAttribute.cs index 6c34f06b82d..046541da03b 100644 --- a/framework/Fur/DatabaseAccessor/Entities/Attributes/NonAutomaticAttribute.cs +++ b/framework/Fur/DatabaseAccessor/Entities/Attributes/NonAutomaticAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Entities/Attributes/QueryableFunctionAttribute.cs b/framework/Fur/DatabaseAccessor/Entities/Attributes/QueryableFunctionAttribute.cs index 03c24f49ced..d990ee91782 100644 --- a/framework/Fur/DatabaseAccessor/Entities/Attributes/QueryableFunctionAttribute.cs +++ b/framework/Fur/DatabaseAccessor/Entities/Attributes/QueryableFunctionAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Entities/Configures/IEntitySeedData.cs b/framework/Fur/DatabaseAccessor/Entities/Configures/IEntitySeedData.cs index 556c816cce6..3cff4e296c8 100644 --- a/framework/Fur/DatabaseAccessor/Entities/Configures/IEntitySeedData.cs +++ b/framework/Fur/DatabaseAccessor/Entities/Configures/IEntitySeedData.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Entities/Configures/IEntityTypeBuilder.cs b/framework/Fur/DatabaseAccessor/Entities/Configures/IEntityTypeBuilder.cs index 752925ffe86..45a47cac24e 100644 --- a/framework/Fur/DatabaseAccessor/Entities/Configures/IEntityTypeBuilder.cs +++ b/framework/Fur/DatabaseAccessor/Entities/Configures/IEntityTypeBuilder.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Entities/Configures/IModelBuilderFilter.cs b/framework/Fur/DatabaseAccessor/Entities/Configures/IModelBuilderFilter.cs index bf6236209f0..e18d818d2a5 100644 --- a/framework/Fur/DatabaseAccessor/Entities/Configures/IModelBuilderFilter.cs +++ b/framework/Fur/DatabaseAccessor/Entities/Configures/IModelBuilderFilter.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Entities/Configures/IPrivateModelBuilder.cs b/framework/Fur/DatabaseAccessor/Entities/Configures/IPrivateModelBuilder.cs index e4305df6aaf..ea6dc65dd7b 100644 --- a/framework/Fur/DatabaseAccessor/Entities/Configures/IPrivateModelBuilder.cs +++ b/framework/Fur/DatabaseAccessor/Entities/Configures/IPrivateModelBuilder.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Entities/Dependencies/Entity.cs b/framework/Fur/DatabaseAccessor/Entities/Dependencies/Entity.cs index be97aff4960..fe9d45d7aa4 100644 --- a/framework/Fur/DatabaseAccessor/Entities/Dependencies/Entity.cs +++ b/framework/Fur/DatabaseAccessor/Entities/Dependencies/Entity.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Entities/Dependencies/EntityBase.cs b/framework/Fur/DatabaseAccessor/Entities/Dependencies/EntityBase.cs index fb1358c598a..f1a03af7448 100644 --- a/framework/Fur/DatabaseAccessor/Entities/Dependencies/EntityBase.cs +++ b/framework/Fur/DatabaseAccessor/Entities/Dependencies/EntityBase.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Entities/Dependencies/EntityNotKey.cs b/framework/Fur/DatabaseAccessor/Entities/Dependencies/EntityNotKey.cs index b5c5657078c..5935529837a 100644 --- a/framework/Fur/DatabaseAccessor/Entities/Dependencies/EntityNotKey.cs +++ b/framework/Fur/DatabaseAccessor/Entities/Dependencies/EntityNotKey.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Entities/Dependencies/IEntity.cs b/framework/Fur/DatabaseAccessor/Entities/Dependencies/IEntity.cs index 96cb39ed1df..d18504f21ef 100644 --- a/framework/Fur/DatabaseAccessor/Entities/Dependencies/IEntity.cs +++ b/framework/Fur/DatabaseAccessor/Entities/Dependencies/IEntity.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Entities/Dependencies/IEntityNotKey.cs b/framework/Fur/DatabaseAccessor/Entities/Dependencies/IEntityNotKey.cs index 9e80bb8d3c0..c188c9592a8 100644 --- a/framework/Fur/DatabaseAccessor/Entities/Dependencies/IEntityNotKey.cs +++ b/framework/Fur/DatabaseAccessor/Entities/Dependencies/IEntityNotKey.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Enums/DbFunctionType.cs b/framework/Fur/DatabaseAccessor/Enums/DbFunctionType.cs index 51c3d3d0b75..fee21d90e2e 100644 --- a/framework/Fur/DatabaseAccessor/Enums/DbFunctionType.cs +++ b/framework/Fur/DatabaseAccessor/Enums/DbFunctionType.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Enums/ManualOptions.cs b/framework/Fur/DatabaseAccessor/Enums/ManualOptions.cs index 1506930156e..3299d23992a 100644 --- a/framework/Fur/DatabaseAccessor/Enums/ManualOptions.cs +++ b/framework/Fur/DatabaseAccessor/Enums/ManualOptions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Extensions/DatabaseAccessorServiceCollectionExtensions.cs b/framework/Fur/DatabaseAccessor/Extensions/DatabaseAccessorServiceCollectionExtensions.cs index 49206d67b23..e2dcfd19abe 100644 --- a/framework/Fur/DatabaseAccessor/Extensions/DatabaseAccessorServiceCollectionExtensions.cs +++ b/framework/Fur/DatabaseAccessor/Extensions/DatabaseAccessorServiceCollectionExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Extensions/DatabaseFacade/DbDataConvertExtensions.cs b/framework/Fur/DatabaseAccessor/Extensions/DatabaseFacade/DbDataConvertExtensions.cs index b8d047e4f17..f3da30521a5 100644 --- a/framework/Fur/DatabaseAccessor/Extensions/DatabaseFacade/DbDataConvertExtensions.cs +++ b/framework/Fur/DatabaseAccessor/Extensions/DatabaseFacade/DbDataConvertExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Extensions/DatabaseFacade/DbObjectExtensions.cs b/framework/Fur/DatabaseAccessor/Extensions/DatabaseFacade/DbObjectExtensions.cs index 8afcddea44c..8eeb15fb950 100644 --- a/framework/Fur/DatabaseAccessor/Extensions/DatabaseFacade/DbObjectExtensions.cs +++ b/framework/Fur/DatabaseAccessor/Extensions/DatabaseFacade/DbObjectExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Extensions/DatabaseFacade/SqlAdoNetExtensions.cs b/framework/Fur/DatabaseAccessor/Extensions/DatabaseFacade/SqlAdoNetExtensions.cs index b5896e19735..d5f90bdf7f5 100644 --- a/framework/Fur/DatabaseAccessor/Extensions/DatabaseFacade/SqlAdoNetExtensions.cs +++ b/framework/Fur/DatabaseAccessor/Extensions/DatabaseFacade/SqlAdoNetExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Extensions/DatabaseProvider/DatabaseProviderServiceCollectionExtensions.cs b/framework/Fur/DatabaseAccessor/Extensions/DatabaseProvider/DatabaseProviderServiceCollectionExtensions.cs index ac0899207f8..e833d2540c1 100644 --- a/framework/Fur/DatabaseAccessor/Extensions/DatabaseProvider/DatabaseProviderServiceCollectionExtensions.cs +++ b/framework/Fur/DatabaseAccessor/Extensions/DatabaseProvider/DatabaseProviderServiceCollectionExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Extensions/DatabaseProvider/Penetrates.cs b/framework/Fur/DatabaseAccessor/Extensions/DatabaseProvider/Penetrates.cs index 8cc809af6b6..f87091ee54c 100644 --- a/framework/Fur/DatabaseAccessor/Extensions/DatabaseProvider/Penetrates.cs +++ b/framework/Fur/DatabaseAccessor/Extensions/DatabaseProvider/Penetrates.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Extensions/PagedQueryableExtensions.cs b/framework/Fur/DatabaseAccessor/Extensions/PagedQueryableExtensions.cs index f9a14138bc6..6d6d63329d9 100644 --- a/framework/Fur/DatabaseAccessor/Extensions/PagedQueryableExtensions.cs +++ b/framework/Fur/DatabaseAccessor/Extensions/PagedQueryableExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Extensions/Repositories/IEntityExtensions.cs b/framework/Fur/DatabaseAccessor/Extensions/Repositories/IEntityExtensions.cs index ec62432167c..446605aa52f 100644 --- a/framework/Fur/DatabaseAccessor/Extensions/Repositories/IEntityExtensions.cs +++ b/framework/Fur/DatabaseAccessor/Extensions/Repositories/IEntityExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Extensions/Repositories/IEntityWithDbContextLocatorExtensions.cs b/framework/Fur/DatabaseAccessor/Extensions/Repositories/IEntityWithDbContextLocatorExtensions.cs index 7b6432afb69..8c0dd5b12c4 100644 --- a/framework/Fur/DatabaseAccessor/Extensions/Repositories/IEntityWithDbContextLocatorExtensions.cs +++ b/framework/Fur/DatabaseAccessor/Extensions/Repositories/IEntityWithDbContextLocatorExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Extensions/Repositories/SqlExtensions.cs b/framework/Fur/DatabaseAccessor/Extensions/Repositories/SqlExtensions.cs index 44f46a2c454..abc3cebe972 100644 --- a/framework/Fur/DatabaseAccessor/Extensions/Repositories/SqlExtensions.cs +++ b/framework/Fur/DatabaseAccessor/Extensions/Repositories/SqlExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Helpers/DbHelpers.cs b/framework/Fur/DatabaseAccessor/Helpers/DbHelpers.cs index cda79ff4961..25389b53cb2 100644 --- a/framework/Fur/DatabaseAccessor/Helpers/DbHelpers.cs +++ b/framework/Fur/DatabaseAccessor/Helpers/DbHelpers.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Interceptors/DbContextSaveChangesInterceptor.cs b/framework/Fur/DatabaseAccessor/Interceptors/DbContextSaveChangesInterceptor.cs index 6c2cb821f06..c727ebcd4c7 100644 --- a/framework/Fur/DatabaseAccessor/Interceptors/DbContextSaveChangesInterceptor.cs +++ b/framework/Fur/DatabaseAccessor/Interceptors/DbContextSaveChangesInterceptor.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Interceptors/SqlCommandProfilerInterceptor.cs b/framework/Fur/DatabaseAccessor/Interceptors/SqlCommandProfilerInterceptor.cs index f731aeb6af6..c21dbefeabd 100644 --- a/framework/Fur/DatabaseAccessor/Interceptors/SqlCommandProfilerInterceptor.cs +++ b/framework/Fur/DatabaseAccessor/Interceptors/SqlCommandProfilerInterceptor.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Interceptors/SqlConnectionProfilerInterceptor.cs b/framework/Fur/DatabaseAccessor/Interceptors/SqlConnectionProfilerInterceptor.cs index 04a0611a962..6f579d587a9 100644 --- a/framework/Fur/DatabaseAccessor/Interceptors/SqlConnectionProfilerInterceptor.cs +++ b/framework/Fur/DatabaseAccessor/Interceptors/SqlConnectionProfilerInterceptor.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Locators/IDbContextLocator.cs b/framework/Fur/DatabaseAccessor/Locators/IDbContextLocator.cs index 8127125e6ac..258f21dcc12 100644 --- a/framework/Fur/DatabaseAccessor/Locators/IDbContextLocator.cs +++ b/framework/Fur/DatabaseAccessor/Locators/IDbContextLocator.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Locators/MasterDbContextLocator.cs b/framework/Fur/DatabaseAccessor/Locators/MasterDbContextLocator.cs index 3f6bc11d80b..c7fef9044b3 100644 --- a/framework/Fur/DatabaseAccessor/Locators/MasterDbContextLocator.cs +++ b/framework/Fur/DatabaseAccessor/Locators/MasterDbContextLocator.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Models/DbProvider.cs b/framework/Fur/DatabaseAccessor/Models/DbProvider.cs index 8ada4c95f29..0278dc16e87 100644 --- a/framework/Fur/DatabaseAccessor/Models/DbProvider.cs +++ b/framework/Fur/DatabaseAccessor/Models/DbProvider.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Models/PagedList.cs b/framework/Fur/DatabaseAccessor/Models/PagedList.cs index 37e7a3718c8..3235fdfff28 100644 --- a/framework/Fur/DatabaseAccessor/Models/PagedList.cs +++ b/framework/Fur/DatabaseAccessor/Models/PagedList.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Models/ProcedureOutputResult.cs b/framework/Fur/DatabaseAccessor/Models/ProcedureOutputResult.cs index 028a2c919f2..0dd6481fb26 100644 --- a/framework/Fur/DatabaseAccessor/Models/ProcedureOutputResult.cs +++ b/framework/Fur/DatabaseAccessor/Models/ProcedureOutputResult.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Models/ProcedureOutputValue.cs b/framework/Fur/DatabaseAccessor/Models/ProcedureOutputValue.cs index 30e895cce76..f2ca8e03eb7 100644 --- a/framework/Fur/DatabaseAccessor/Models/ProcedureOutputValue.cs +++ b/framework/Fur/DatabaseAccessor/Models/ProcedureOutputValue.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Models/SqlTemplate.cs b/framework/Fur/DatabaseAccessor/Models/SqlTemplate.cs index 92265ed1310..2c4f9024874 100644 --- a/framework/Fur/DatabaseAccessor/Models/SqlTemplate.cs +++ b/framework/Fur/DatabaseAccessor/Models/SqlTemplate.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Models/SqlTemplateParameter.cs b/framework/Fur/DatabaseAccessor/Models/SqlTemplateParameter.cs index e30dda26618..94d3db2a5f4 100644 --- a/framework/Fur/DatabaseAccessor/Models/SqlTemplateParameter.cs +++ b/framework/Fur/DatabaseAccessor/Models/SqlTemplateParameter.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/MultiTenants/Dependencies/IMultiTenantOnDatabase.cs b/framework/Fur/DatabaseAccessor/MultiTenants/Dependencies/IMultiTenantOnDatabase.cs index 8ad3da1f528..49a72b4282b 100644 --- a/framework/Fur/DatabaseAccessor/MultiTenants/Dependencies/IMultiTenantOnDatabase.cs +++ b/framework/Fur/DatabaseAccessor/MultiTenants/Dependencies/IMultiTenantOnDatabase.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/MultiTenants/Dependencies/IMultiTenantOnSchema.cs b/framework/Fur/DatabaseAccessor/MultiTenants/Dependencies/IMultiTenantOnSchema.cs index 7150fce15d2..5073f5bf152 100644 --- a/framework/Fur/DatabaseAccessor/MultiTenants/Dependencies/IMultiTenantOnSchema.cs +++ b/framework/Fur/DatabaseAccessor/MultiTenants/Dependencies/IMultiTenantOnSchema.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/MultiTenants/Dependencies/IMultiTenantOnTable.cs b/framework/Fur/DatabaseAccessor/MultiTenants/Dependencies/IMultiTenantOnTable.cs index 49198ce6049..8676e1b1c53 100644 --- a/framework/Fur/DatabaseAccessor/MultiTenants/Dependencies/IMultiTenantOnTable.cs +++ b/framework/Fur/DatabaseAccessor/MultiTenants/Dependencies/IMultiTenantOnTable.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/MultiTenants/Dependencies/IPrivateMultiTenant.cs b/framework/Fur/DatabaseAccessor/MultiTenants/Dependencies/IPrivateMultiTenant.cs index 79035ff1a6c..f607f34e819 100644 --- a/framework/Fur/DatabaseAccessor/MultiTenants/Dependencies/IPrivateMultiTenant.cs +++ b/framework/Fur/DatabaseAccessor/MultiTenants/Dependencies/IPrivateMultiTenant.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/MultiTenants/Entities/Tenant.cs b/framework/Fur/DatabaseAccessor/MultiTenants/Entities/Tenant.cs index 3eadb8a3a6a..5ebbd988582 100644 --- a/framework/Fur/DatabaseAccessor/MultiTenants/Entities/Tenant.cs +++ b/framework/Fur/DatabaseAccessor/MultiTenants/Entities/Tenant.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/MultiTenants/Enums/MultiTenantOptions.cs b/framework/Fur/DatabaseAccessor/MultiTenants/Enums/MultiTenantOptions.cs index 5445e49b06d..dba4d3aeae1 100644 --- a/framework/Fur/DatabaseAccessor/MultiTenants/Enums/MultiTenantOptions.cs +++ b/framework/Fur/DatabaseAccessor/MultiTenants/Enums/MultiTenantOptions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/MultiTenants/Locators/MultiTenantDbContextLocator.cs b/framework/Fur/DatabaseAccessor/MultiTenants/Locators/MultiTenantDbContextLocator.cs index 09aaca31320..03728ed2463 100644 --- a/framework/Fur/DatabaseAccessor/MultiTenants/Locators/MultiTenantDbContextLocator.cs +++ b/framework/Fur/DatabaseAccessor/MultiTenants/Locators/MultiTenantDbContextLocator.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Pools/DbContextPool.cs b/framework/Fur/DatabaseAccessor/Pools/DbContextPool.cs index b4203778523..3a2bc80b98b 100644 --- a/framework/Fur/DatabaseAccessor/Pools/DbContextPool.cs +++ b/framework/Fur/DatabaseAccessor/Pools/DbContextPool.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Pools/IDbContextPool.cs b/framework/Fur/DatabaseAccessor/Pools/IDbContextPool.cs index 22dfb036d4c..40ca3260bec 100644 --- a/framework/Fur/DatabaseAccessor/Pools/IDbContextPool.cs +++ b/framework/Fur/DatabaseAccessor/Pools/IDbContextPool.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IDeletableRepository.cs b/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IDeletableRepository.cs index baf57f39ae9..1acd44aec84 100644 --- a/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IDeletableRepository.cs +++ b/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IDeletableRepository.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IInsertableRepository.cs b/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IInsertableRepository.cs index 6ed98a960ea..630d4e3f749 100644 --- a/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IInsertableRepository.cs +++ b/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IInsertableRepository.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IOperableRepository.cs b/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IOperableRepository.cs index 5c0b3ed90d1..8a6bbe91f93 100644 --- a/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IOperableRepository.cs +++ b/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IOperableRepository.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IReadableRepository.cs b/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IReadableRepository.cs index 2b18da255f6..4a14a874f83 100644 --- a/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IReadableRepository.cs +++ b/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IReadableRepository.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IRepositoryDependency.cs b/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IRepositoryDependency.cs index 0d7ac88837a..1e0413153ec 100644 --- a/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IRepositoryDependency.cs +++ b/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IRepositoryDependency.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Repositories/Dependencies/ISqlExecutableRepository.cs b/framework/Fur/DatabaseAccessor/Repositories/Dependencies/ISqlExecutableRepository.cs index 57b2614f00c..8ee9066057e 100644 --- a/framework/Fur/DatabaseAccessor/Repositories/Dependencies/ISqlExecutableRepository.cs +++ b/framework/Fur/DatabaseAccessor/Repositories/Dependencies/ISqlExecutableRepository.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Repositories/Dependencies/ISqlReaderRepository.cs b/framework/Fur/DatabaseAccessor/Repositories/Dependencies/ISqlReaderRepository.cs index 3b5359b4003..c3726cf8ab0 100644 --- a/framework/Fur/DatabaseAccessor/Repositories/Dependencies/ISqlReaderRepository.cs +++ b/framework/Fur/DatabaseAccessor/Repositories/Dependencies/ISqlReaderRepository.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IUpdateableRepository.cs b/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IUpdateableRepository.cs index 914ad137c58..f07a0b9a6b2 100644 --- a/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IUpdateableRepository.cs +++ b/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IUpdateableRepository.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IWritableRepository.cs b/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IWritableRepository.cs index ede26d0bba6..02c38925b64 100644 --- a/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IWritableRepository.cs +++ b/framework/Fur/DatabaseAccessor/Repositories/Dependencies/IWritableRepository.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Repositories/EFCoreRepository.cs b/framework/Fur/DatabaseAccessor/Repositories/EFCoreRepository.cs index ef86e8a6a6c..6c288b680f2 100644 --- a/framework/Fur/DatabaseAccessor/Repositories/EFCoreRepository.cs +++ b/framework/Fur/DatabaseAccessor/Repositories/EFCoreRepository.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Repositories/IMSRepository.cs b/framework/Fur/DatabaseAccessor/Repositories/IMSRepository.cs index 1c4704bc079..d516efeb49e 100644 --- a/framework/Fur/DatabaseAccessor/Repositories/IMSRepository.cs +++ b/framework/Fur/DatabaseAccessor/Repositories/IMSRepository.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Repositories/IRepository.cs b/framework/Fur/DatabaseAccessor/Repositories/IRepository.cs index 441ce3c1f78..99d03d13fc8 100644 --- a/framework/Fur/DatabaseAccessor/Repositories/IRepository.cs +++ b/framework/Fur/DatabaseAccessor/Repositories/IRepository.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Repositories/ISqlRepository.cs b/framework/Fur/DatabaseAccessor/Repositories/ISqlRepository.cs index c3e01c821f8..fe9e1923a8e 100644 --- a/framework/Fur/DatabaseAccessor/Repositories/ISqlRepository.cs +++ b/framework/Fur/DatabaseAccessor/Repositories/ISqlRepository.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Repositories/Implantations/DeletableRepository.cs b/framework/Fur/DatabaseAccessor/Repositories/Implantations/DeletableRepository.cs index 89495608f51..cce9cd788c2 100644 --- a/framework/Fur/DatabaseAccessor/Repositories/Implantations/DeletableRepository.cs +++ b/framework/Fur/DatabaseAccessor/Repositories/Implantations/DeletableRepository.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Repositories/Implantations/InsertableRepository.cs b/framework/Fur/DatabaseAccessor/Repositories/Implantations/InsertableRepository.cs index 33b192f8a63..4dc0efc05de 100644 --- a/framework/Fur/DatabaseAccessor/Repositories/Implantations/InsertableRepository.cs +++ b/framework/Fur/DatabaseAccessor/Repositories/Implantations/InsertableRepository.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Repositories/Implantations/OperableRepository.cs b/framework/Fur/DatabaseAccessor/Repositories/Implantations/OperableRepository.cs index 2ee6ec520c0..03518b77cd9 100644 --- a/framework/Fur/DatabaseAccessor/Repositories/Implantations/OperableRepository.cs +++ b/framework/Fur/DatabaseAccessor/Repositories/Implantations/OperableRepository.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Repositories/Implantations/ReadableRepository.cs b/framework/Fur/DatabaseAccessor/Repositories/Implantations/ReadableRepository.cs index 847d90f397d..689f2db64c9 100644 --- a/framework/Fur/DatabaseAccessor/Repositories/Implantations/ReadableRepository.cs +++ b/framework/Fur/DatabaseAccessor/Repositories/Implantations/ReadableRepository.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Repositories/Implantations/SqlExecutableRepository.cs b/framework/Fur/DatabaseAccessor/Repositories/Implantations/SqlExecutableRepository.cs index 69eb56b3b79..7cc6368deaa 100644 --- a/framework/Fur/DatabaseAccessor/Repositories/Implantations/SqlExecutableRepository.cs +++ b/framework/Fur/DatabaseAccessor/Repositories/Implantations/SqlExecutableRepository.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Repositories/Implantations/SqlReaderRepository.cs b/framework/Fur/DatabaseAccessor/Repositories/Implantations/SqlReaderRepository.cs index bf742aefc81..3f70885e7f8 100644 --- a/framework/Fur/DatabaseAccessor/Repositories/Implantations/SqlReaderRepository.cs +++ b/framework/Fur/DatabaseAccessor/Repositories/Implantations/SqlReaderRepository.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Repositories/Implantations/UpdateableRepository.cs b/framework/Fur/DatabaseAccessor/Repositories/Implantations/UpdateableRepository.cs index c9059dfed0d..e53bbd141ec 100644 --- a/framework/Fur/DatabaseAccessor/Repositories/Implantations/UpdateableRepository.cs +++ b/framework/Fur/DatabaseAccessor/Repositories/Implantations/UpdateableRepository.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Repositories/Implantations/WritableRepository.cs b/framework/Fur/DatabaseAccessor/Repositories/Implantations/WritableRepository.cs index 4df506c5e29..15c17b8635b 100644 --- a/framework/Fur/DatabaseAccessor/Repositories/Implantations/WritableRepository.cs +++ b/framework/Fur/DatabaseAccessor/Repositories/Implantations/WritableRepository.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Repositories/MSRepository.cs b/framework/Fur/DatabaseAccessor/Repositories/MSRepository.cs index 20426a9e49e..dc67bf4a81d 100644 --- a/framework/Fur/DatabaseAccessor/Repositories/MSRepository.cs +++ b/framework/Fur/DatabaseAccessor/Repositories/MSRepository.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/Repositories/SqlRepository.cs b/framework/Fur/DatabaseAccessor/Repositories/SqlRepository.cs index b8ca7b7901c..09cf2317cda 100644 --- a/framework/Fur/DatabaseAccessor/Repositories/SqlRepository.cs +++ b/framework/Fur/DatabaseAccessor/Repositories/SqlRepository.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/UnitOfWork/Attributes/NonTransactAttribute.cs b/framework/Fur/DatabaseAccessor/UnitOfWork/Attributes/NonTransactAttribute.cs index d83b9da00f9..6b7748d9bc8 100644 --- a/framework/Fur/DatabaseAccessor/UnitOfWork/Attributes/NonTransactAttribute.cs +++ b/framework/Fur/DatabaseAccessor/UnitOfWork/Attributes/NonTransactAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/UnitOfWork/Attributes/UnitOfWorkAttribute.cs b/framework/Fur/DatabaseAccessor/UnitOfWork/Attributes/UnitOfWorkAttribute.cs index 0825aeb6af5..5e189a03739 100644 --- a/framework/Fur/DatabaseAccessor/UnitOfWork/Attributes/UnitOfWorkAttribute.cs +++ b/framework/Fur/DatabaseAccessor/UnitOfWork/Attributes/UnitOfWorkAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DatabaseAccessor/UnitOfWork/Filters/UnitOfWorkFilter.cs b/framework/Fur/DatabaseAccessor/UnitOfWork/Filters/UnitOfWorkFilter.cs index 6d7448bb315..b1ecd2d868b 100644 --- a/framework/Fur/DatabaseAccessor/UnitOfWork/Filters/UnitOfWorkFilter.cs +++ b/framework/Fur/DatabaseAccessor/UnitOfWork/Filters/UnitOfWorkFilter.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DependencyInjection/Attributes/InjectionAttribute.cs b/framework/Fur/DependencyInjection/Attributes/InjectionAttribute.cs index eccd3052f06..932c50ac388 100644 --- a/framework/Fur/DependencyInjection/Attributes/InjectionAttribute.cs +++ b/framework/Fur/DependencyInjection/Attributes/InjectionAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DependencyInjection/Attributes/SkipScanAttribute.cs b/framework/Fur/DependencyInjection/Attributes/SkipScanAttribute.cs index e8f73f9e891..b6b09b47af6 100644 --- a/framework/Fur/DependencyInjection/Attributes/SkipScanAttribute.cs +++ b/framework/Fur/DependencyInjection/Attributes/SkipScanAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DependencyInjection/Dependencies/IPrivateDependency.cs b/framework/Fur/DependencyInjection/Dependencies/IPrivateDependency.cs index 8be76bd8c4c..368a984dc8a 100644 --- a/framework/Fur/DependencyInjection/Dependencies/IPrivateDependency.cs +++ b/framework/Fur/DependencyInjection/Dependencies/IPrivateDependency.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DependencyInjection/Dependencies/IScoped.cs b/framework/Fur/DependencyInjection/Dependencies/IScoped.cs index cc8165a753e..7d368b68bfd 100644 --- a/framework/Fur/DependencyInjection/Dependencies/IScoped.cs +++ b/framework/Fur/DependencyInjection/Dependencies/IScoped.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DependencyInjection/Dependencies/ISingleton.cs b/framework/Fur/DependencyInjection/Dependencies/ISingleton.cs index d6a98a344f6..259495f7c9f 100644 --- a/framework/Fur/DependencyInjection/Dependencies/ISingleton.cs +++ b/framework/Fur/DependencyInjection/Dependencies/ISingleton.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DependencyInjection/Dependencies/ITransient.cs b/framework/Fur/DependencyInjection/Dependencies/ITransient.cs index 3aaaaa941f4..bf625e8f214 100644 --- a/framework/Fur/DependencyInjection/Dependencies/ITransient.cs +++ b/framework/Fur/DependencyInjection/Dependencies/ITransient.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DependencyInjection/Enums/InjectionActions.cs b/framework/Fur/DependencyInjection/Enums/InjectionActions.cs index 960c1d40014..8891ed8ec5a 100644 --- a/framework/Fur/DependencyInjection/Enums/InjectionActions.cs +++ b/framework/Fur/DependencyInjection/Enums/InjectionActions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DependencyInjection/Enums/InjectionPatterns.cs b/framework/Fur/DependencyInjection/Enums/InjectionPatterns.cs index 27e892abcd9..4a97c3db333 100644 --- a/framework/Fur/DependencyInjection/Enums/InjectionPatterns.cs +++ b/framework/Fur/DependencyInjection/Enums/InjectionPatterns.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DependencyInjection/Enums/RegisterType.cs b/framework/Fur/DependencyInjection/Enums/RegisterType.cs index dd799129749..b9c90ba022f 100644 --- a/framework/Fur/DependencyInjection/Enums/RegisterType.cs +++ b/framework/Fur/DependencyInjection/Enums/RegisterType.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DependencyInjection/Extensions/DependencyInjectionServiceCollectionExtensions.cs b/framework/Fur/DependencyInjection/Extensions/DependencyInjectionServiceCollectionExtensions.cs index a09eed7cfb2..09a84ccd507 100644 --- a/framework/Fur/DependencyInjection/Extensions/DependencyInjectionServiceCollectionExtensions.cs +++ b/framework/Fur/DependencyInjection/Extensions/DependencyInjectionServiceCollectionExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DependencyInjection/Models/ExternalService.cs b/framework/Fur/DependencyInjection/Models/ExternalService.cs index 4d60d59822c..0dbbbac66f0 100644 --- a/framework/Fur/DependencyInjection/Models/ExternalService.cs +++ b/framework/Fur/DependencyInjection/Models/ExternalService.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DependencyInjection/Options/DependencyInjectionSettingsOptions.cs b/framework/Fur/DependencyInjection/Options/DependencyInjectionSettingsOptions.cs index 26860f1401c..cea4f8d6317 100644 --- a/framework/Fur/DependencyInjection/Options/DependencyInjectionSettingsOptions.cs +++ b/framework/Fur/DependencyInjection/Options/DependencyInjectionSettingsOptions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DynamicApiController/Attributes/ApiDescriptionSettingsAttribute.cs b/framework/Fur/DynamicApiController/Attributes/ApiDescriptionSettingsAttribute.cs index 5a198e2c674..2bd18dd2379 100644 --- a/framework/Fur/DynamicApiController/Attributes/ApiDescriptionSettingsAttribute.cs +++ b/framework/Fur/DynamicApiController/Attributes/ApiDescriptionSettingsAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DynamicApiController/Attributes/ApiSeatAttribute.cs b/framework/Fur/DynamicApiController/Attributes/ApiSeatAttribute.cs index c71fd975127..d3fca5b3997 100644 --- a/framework/Fur/DynamicApiController/Attributes/ApiSeatAttribute.cs +++ b/framework/Fur/DynamicApiController/Attributes/ApiSeatAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DynamicApiController/Attributes/DynamicApiControllerAttribute.cs b/framework/Fur/DynamicApiController/Attributes/DynamicApiControllerAttribute.cs index 3f961254b0f..2ead79d4d0e 100644 --- a/framework/Fur/DynamicApiController/Attributes/DynamicApiControllerAttribute.cs +++ b/framework/Fur/DynamicApiController/Attributes/DynamicApiControllerAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DynamicApiController/Conventions/DynamicApiControllerApplicationModelConvention.cs b/framework/Fur/DynamicApiController/Conventions/DynamicApiControllerApplicationModelConvention.cs index 10f2282b70e..1453a4eece9 100644 --- a/framework/Fur/DynamicApiController/Conventions/DynamicApiControllerApplicationModelConvention.cs +++ b/framework/Fur/DynamicApiController/Conventions/DynamicApiControllerApplicationModelConvention.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DynamicApiController/Dependencies/IDynamicApiController.cs b/framework/Fur/DynamicApiController/Dependencies/IDynamicApiController.cs index 084295c2720..fb320c5ce93 100644 --- a/framework/Fur/DynamicApiController/Dependencies/IDynamicApiController.cs +++ b/framework/Fur/DynamicApiController/Dependencies/IDynamicApiController.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DynamicApiController/Enums/ApiSeats.cs b/framework/Fur/DynamicApiController/Enums/ApiSeats.cs index 4b232de49b1..b70ac510487 100644 --- a/framework/Fur/DynamicApiController/Enums/ApiSeats.cs +++ b/framework/Fur/DynamicApiController/Enums/ApiSeats.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DynamicApiController/Extensions/DynamicApiControllerServiceCollectionExtensions.cs b/framework/Fur/DynamicApiController/Extensions/DynamicApiControllerServiceCollectionExtensions.cs index a40848ef76a..f0c29975d51 100644 --- a/framework/Fur/DynamicApiController/Extensions/DynamicApiControllerServiceCollectionExtensions.cs +++ b/framework/Fur/DynamicApiController/Extensions/DynamicApiControllerServiceCollectionExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DynamicApiController/Models/ParameterRouteTemplate.cs b/framework/Fur/DynamicApiController/Models/ParameterRouteTemplate.cs index 14280fbb185..80b18ec645e 100644 --- a/framework/Fur/DynamicApiController/Models/ParameterRouteTemplate.cs +++ b/framework/Fur/DynamicApiController/Models/ParameterRouteTemplate.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DynamicApiController/Options/DynamicApiControllerSettingsOptions.cs b/framework/Fur/DynamicApiController/Options/DynamicApiControllerSettingsOptions.cs index 18f0b9fdbe7..d9144c41dde 100644 --- a/framework/Fur/DynamicApiController/Options/DynamicApiControllerSettingsOptions.cs +++ b/framework/Fur/DynamicApiController/Options/DynamicApiControllerSettingsOptions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DynamicApiController/Penetrates.cs b/framework/Fur/DynamicApiController/Penetrates.cs index ed2196d8f44..e0353b24821 100644 --- a/framework/Fur/DynamicApiController/Penetrates.cs +++ b/framework/Fur/DynamicApiController/Penetrates.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/DynamicApiController/Providers/DynamicApiControllerFeatureProvider.cs b/framework/Fur/DynamicApiController/Providers/DynamicApiControllerFeatureProvider.cs index 394551f0acc..c240b18b672 100644 --- a/framework/Fur/DynamicApiController/Providers/DynamicApiControllerFeatureProvider.cs +++ b/framework/Fur/DynamicApiController/Providers/DynamicApiControllerFeatureProvider.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/FriendlyException/Attributes/ErrorCodeItemMetadataAttribute.cs b/framework/Fur/FriendlyException/Attributes/ErrorCodeItemMetadataAttribute.cs index ac72204dc61..c73acb20d85 100644 --- a/framework/Fur/FriendlyException/Attributes/ErrorCodeItemMetadataAttribute.cs +++ b/framework/Fur/FriendlyException/Attributes/ErrorCodeItemMetadataAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/FriendlyException/Attributes/ErrorCodeTypeAttribute.cs b/framework/Fur/FriendlyException/Attributes/ErrorCodeTypeAttribute.cs index edf59f2d690..07ae58fa2e1 100644 --- a/framework/Fur/FriendlyException/Attributes/ErrorCodeTypeAttribute.cs +++ b/framework/Fur/FriendlyException/Attributes/ErrorCodeTypeAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/FriendlyException/Attributes/IfExceptionAttribute.cs b/framework/Fur/FriendlyException/Attributes/IfExceptionAttribute.cs index 82124a2c746..ce02bbf7d8f 100644 --- a/framework/Fur/FriendlyException/Attributes/IfExceptionAttribute.cs +++ b/framework/Fur/FriendlyException/Attributes/IfExceptionAttribute.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/FriendlyException/Extensions/FriendlyExceptionServiceCollectionExtensions.cs b/framework/Fur/FriendlyException/Extensions/FriendlyExceptionServiceCollectionExtensions.cs index e1cdbb275f6..81d9f632b04 100644 --- a/framework/Fur/FriendlyException/Extensions/FriendlyExceptionServiceCollectionExtensions.cs +++ b/framework/Fur/FriendlyException/Extensions/FriendlyExceptionServiceCollectionExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/FriendlyException/Filters/FriendlyExceptionFilter.cs b/framework/Fur/FriendlyException/Filters/FriendlyExceptionFilter.cs index aa028bcced8..52ab668351c 100644 --- a/framework/Fur/FriendlyException/Filters/FriendlyExceptionFilter.cs +++ b/framework/Fur/FriendlyException/Filters/FriendlyExceptionFilter.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/FriendlyException/Models/MethodIfException.cs b/framework/Fur/FriendlyException/Models/MethodIfException.cs index a042680570e..e67ac6e2bf3 100644 --- a/framework/Fur/FriendlyException/Models/MethodIfException.cs +++ b/framework/Fur/FriendlyException/Models/MethodIfException.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/FriendlyException/Oops.cs b/framework/Fur/FriendlyException/Oops.cs index d20d209110f..5e21f1fd259 100644 --- a/framework/Fur/FriendlyException/Oops.cs +++ b/framework/Fur/FriendlyException/Oops.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/FriendlyException/Options/ErrorCodeMessageSettingsOptions.cs b/framework/Fur/FriendlyException/Options/ErrorCodeMessageSettingsOptions.cs index 2cd737672bf..d83f0855e3e 100644 --- a/framework/Fur/FriendlyException/Options/ErrorCodeMessageSettingsOptions.cs +++ b/framework/Fur/FriendlyException/Options/ErrorCodeMessageSettingsOptions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/FriendlyException/Providers/IErrorCodeTypeProvider.cs b/framework/Fur/FriendlyException/Providers/IErrorCodeTypeProvider.cs index 2fc242c5677..de5ad9672bd 100644 --- a/framework/Fur/FriendlyException/Providers/IErrorCodeTypeProvider.cs +++ b/framework/Fur/FriendlyException/Providers/IErrorCodeTypeProvider.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/Fur.csproj b/framework/Fur/Fur.csproj index f0a2db97739..1e71c0716e0 100644 --- a/framework/Fur/Fur.csproj +++ b/framework/Fur/Fur.csproj @@ -10,7 +10,7 @@ https://gitee.com/monksoul/Fur Gitee Apache-2.0 - 1.0.0-rc2.2020.10.14 + 1.0.0-rc.final true @@ -28,11 +28,11 @@ - - - - - + + + + + diff --git a/framework/Fur/FurStartup.cs b/framework/Fur/FurStartup.cs index fd263373f59..f13f29d9d87 100644 --- a/framework/Fur/FurStartup.cs +++ b/framework/Fur/FurStartup.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/LinqBuilder/Builders/LinqExpression.cs b/framework/Fur/LinqBuilder/Builders/LinqExpression.cs index 58378dc9cef..43adeb47c7e 100644 --- a/framework/Fur/LinqBuilder/Builders/LinqExpression.cs +++ b/framework/Fur/LinqBuilder/Builders/LinqExpression.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/LinqBuilder/Extensions/LinqExtensions.cs b/framework/Fur/LinqBuilder/Extensions/LinqExtensions.cs index 717c3af009c..959a6c88802 100644 --- a/framework/Fur/LinqBuilder/Extensions/LinqExtensions.cs +++ b/framework/Fur/LinqBuilder/Extensions/LinqExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/LinqBuilder/Visitors/ParameterReplaceExpressionVisitor.cs b/framework/Fur/LinqBuilder/Visitors/ParameterReplaceExpressionVisitor.cs index 3129f531b12..ec8bc3e631b 100644 --- a/framework/Fur/LinqBuilder/Visitors/ParameterReplaceExpressionVisitor.cs +++ b/framework/Fur/LinqBuilder/Visitors/ParameterReplaceExpressionVisitor.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/ObjectMapper/Dependencies/IObjectMapper.cs b/framework/Fur/ObjectMapper/Dependencies/IObjectMapper.cs index 9094387b5f0..1e750ec80dd 100644 --- a/framework/Fur/ObjectMapper/Dependencies/IObjectMapper.cs +++ b/framework/Fur/ObjectMapper/Dependencies/IObjectMapper.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/ObjectMapper/Extensions/ObjectMapperServiceCollectionExtensions.cs b/framework/Fur/ObjectMapper/Extensions/ObjectMapperServiceCollectionExtensions.cs index 4652b391315..3ee7c9834aa 100644 --- a/framework/Fur/ObjectMapper/Extensions/ObjectMapperServiceCollectionExtensions.cs +++ b/framework/Fur/ObjectMapper/Extensions/ObjectMapperServiceCollectionExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/SpecificationDocument/Builders/SpecificationDocumentBuilder.cs b/framework/Fur/SpecificationDocument/Builders/SpecificationDocumentBuilder.cs index 8beb0db6726..42dc51edf3b 100644 --- a/framework/Fur/SpecificationDocument/Builders/SpecificationDocumentBuilder.cs +++ b/framework/Fur/SpecificationDocument/Builders/SpecificationDocumentBuilder.cs @@ -4,10 +4,10 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net -// 源码地址:Gitee:https://gitee.com/monksoul/Fur -// Github:https://github.com/monksoul/Fur +// 源码地址:Gitee:https://gitee.com/monksoul/Fur +// Github:https://github.com/monksoul/Fur // 开源协议:Apache-2.0(http://www.apache.org/licenses/LICENSE-2.0) // ----------------------------------------------------------------------------- diff --git a/framework/Fur/SpecificationDocument/Extensions/SpecificationDocumentApplicationBuilderExtensions.cs b/framework/Fur/SpecificationDocument/Extensions/SpecificationDocumentApplicationBuilderExtensions.cs index 79d274d2810..b80176edaa6 100644 --- a/framework/Fur/SpecificationDocument/Extensions/SpecificationDocumentApplicationBuilderExtensions.cs +++ b/framework/Fur/SpecificationDocument/Extensions/SpecificationDocumentApplicationBuilderExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/SpecificationDocument/Extensions/SpecificationDocumentServiceCollectionExtensions.cs b/framework/Fur/SpecificationDocument/Extensions/SpecificationDocumentServiceCollectionExtensions.cs index b983a83d23e..d7d88bf6ced 100644 --- a/framework/Fur/SpecificationDocument/Extensions/SpecificationDocumentServiceCollectionExtensions.cs +++ b/framework/Fur/SpecificationDocument/Extensions/SpecificationDocumentServiceCollectionExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/SpecificationDocument/Filters/EnumSchemaFilter.cs b/framework/Fur/SpecificationDocument/Filters/EnumSchemaFilter.cs index 8f70fb335f7..e14539df801 100644 --- a/framework/Fur/SpecificationDocument/Filters/EnumSchemaFilter.cs +++ b/framework/Fur/SpecificationDocument/Filters/EnumSchemaFilter.cs @@ -4,10 +4,10 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net -// 源码地址:Gitee:https://gitee.com/monksoul/Fur -// Github:https://github.com/monksoul/Fur +// 源码地址:Gitee:https://gitee.com/monksoul/Fur +// Github:https://github.com/monksoul/Fur // 开源协议:Apache-2.0(http://www.apache.org/licenses/LICENSE-2.0) // ----------------------------------------------------------------------------- diff --git a/framework/Fur/SpecificationDocument/Models/GroupOrder.cs b/framework/Fur/SpecificationDocument/Models/GroupOrder.cs index 47ff74d1ac6..2beb30bcc2b 100644 --- a/framework/Fur/SpecificationDocument/Models/GroupOrder.cs +++ b/framework/Fur/SpecificationDocument/Models/GroupOrder.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/SpecificationDocument/Models/SpecificationOpenApiInfo.cs b/framework/Fur/SpecificationDocument/Models/SpecificationOpenApiInfo.cs index 8ad6353d558..f41d11f6541 100644 --- a/framework/Fur/SpecificationDocument/Models/SpecificationOpenApiInfo.cs +++ b/framework/Fur/SpecificationDocument/Models/SpecificationOpenApiInfo.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/SpecificationDocument/Models/SpecificationOpenApiSecurityRequirementItem.cs b/framework/Fur/SpecificationDocument/Models/SpecificationOpenApiSecurityRequirementItem.cs index c6dd44e9e26..fa0570baea1 100644 --- a/framework/Fur/SpecificationDocument/Models/SpecificationOpenApiSecurityRequirementItem.cs +++ b/framework/Fur/SpecificationDocument/Models/SpecificationOpenApiSecurityRequirementItem.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/SpecificationDocument/Models/SpecificationOpenApiSecurityScheme.cs b/framework/Fur/SpecificationDocument/Models/SpecificationOpenApiSecurityScheme.cs index d846c1cedfb..c7fb7538c5b 100644 --- a/framework/Fur/SpecificationDocument/Models/SpecificationOpenApiSecurityScheme.cs +++ b/framework/Fur/SpecificationDocument/Models/SpecificationOpenApiSecurityScheme.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/SpecificationDocument/Options/SpecificationDocumentSettingsOptions.cs b/framework/Fur/SpecificationDocument/Options/SpecificationDocumentSettingsOptions.cs index e089c826c1c..1f2de99e861 100644 --- a/framework/Fur/SpecificationDocument/Options/SpecificationDocumentSettingsOptions.cs +++ b/framework/Fur/SpecificationDocument/Options/SpecificationDocumentSettingsOptions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur @@ -78,7 +78,7 @@ public void PostConfigure(SpecificationDocumentSettingsOptions options, IConfigu options.DocumentTitle ??= "Specification Api Document"; options.DefaultGroupName ??= "Default"; options.FormatAsV2 ??= false; - options.RoutePrefix ??= string.Empty; + options.RoutePrefix ??= "api"; options.DocExpansionState ??= DocExpansion.List; XmlComments ??= new string[] { diff --git a/framework/Fur/UnifyResult/Extensions/UnifyResultServiceCollectionExtensions.cs b/framework/Fur/UnifyResult/Extensions/UnifyResultServiceCollectionExtensions.cs index 55b559f6c5f..df7e2e52331 100644 --- a/framework/Fur/UnifyResult/Extensions/UnifyResultServiceCollectionExtensions.cs +++ b/framework/Fur/UnifyResult/Extensions/UnifyResultServiceCollectionExtensions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/UnifyResult/Filters/SuccessUnifyResultFilter.cs b/framework/Fur/UnifyResult/Filters/SuccessUnifyResultFilter.cs index d5a114113b1..41bd7f4be4b 100644 --- a/framework/Fur/UnifyResult/Filters/SuccessUnifyResultFilter.cs +++ b/framework/Fur/UnifyResult/Filters/SuccessUnifyResultFilter.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/UnifyResult/Models/RESTfulResult.cs b/framework/Fur/UnifyResult/Models/RESTfulResult.cs index bf746aff0ac..64bc72afa99 100644 --- a/framework/Fur/UnifyResult/Models/RESTfulResult.cs +++ b/framework/Fur/UnifyResult/Models/RESTfulResult.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/UnifyResult/Providers/IUnifyResultProvider.cs b/framework/Fur/UnifyResult/Providers/IUnifyResultProvider.cs index 1814d5cc3dc..f4eb983f9a9 100644 --- a/framework/Fur/UnifyResult/Providers/IUnifyResultProvider.cs +++ b/framework/Fur/UnifyResult/Providers/IUnifyResultProvider.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/UnifyResult/Providers/RESTfulResultProvider.cs b/framework/Fur/UnifyResult/Providers/RESTfulResultProvider.cs index 908cba915c0..04ceb4dd803 100644 --- a/framework/Fur/UnifyResult/Providers/RESTfulResultProvider.cs +++ b/framework/Fur/UnifyResult/Providers/RESTfulResultProvider.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/ViewEngine/Compilations/IViewEngineCompilationOptionsBuilder.cs b/framework/Fur/ViewEngine/Compilations/IViewEngineCompilationOptionsBuilder.cs index 8d87c489db5..d804f0ee7c6 100644 --- a/framework/Fur/ViewEngine/Compilations/IViewEngineCompilationOptionsBuilder.cs +++ b/framework/Fur/ViewEngine/Compilations/IViewEngineCompilationOptionsBuilder.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/ViewEngine/Compilations/ViewEngineCompilationOptionsBuilder.cs b/framework/Fur/ViewEngine/Compilations/ViewEngineCompilationOptionsBuilder.cs index 24473af89da..efc6f0e1c88 100644 --- a/framework/Fur/ViewEngine/Compilations/ViewEngineCompilationOptionsBuilder.cs +++ b/framework/Fur/ViewEngine/Compilations/ViewEngineCompilationOptionsBuilder.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/ViewEngine/Exceptions/ViewEngineCompilationException.cs b/framework/Fur/ViewEngine/Exceptions/ViewEngineCompilationException.cs index b4499ea88c8..7f133470724 100644 --- a/framework/Fur/ViewEngine/Exceptions/ViewEngineCompilationException.cs +++ b/framework/Fur/ViewEngine/Exceptions/ViewEngineCompilationException.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/ViewEngine/Exceptions/ViewEngineException.cs b/framework/Fur/ViewEngine/Exceptions/ViewEngineException.cs index dd7e3316d91..63a7f9bd549 100644 --- a/framework/Fur/ViewEngine/Exceptions/ViewEngineException.cs +++ b/framework/Fur/ViewEngine/Exceptions/ViewEngineException.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/ViewEngine/IViewEngine.cs b/framework/Fur/ViewEngine/IViewEngine.cs index bb01d7aa117..31f6eb5e1fa 100644 --- a/framework/Fur/ViewEngine/IViewEngine.cs +++ b/framework/Fur/ViewEngine/IViewEngine.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/ViewEngine/Models/AnonymousTypeWrapper.cs b/framework/Fur/ViewEngine/Models/AnonymousTypeWrapper.cs index 72a19745abf..4cc715fdb5b 100644 --- a/framework/Fur/ViewEngine/Models/AnonymousTypeWrapper.cs +++ b/framework/Fur/ViewEngine/Models/AnonymousTypeWrapper.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/ViewEngine/Options/ViewEngineCompilationOptions.cs b/framework/Fur/ViewEngine/Options/ViewEngineCompilationOptions.cs index a07b03c7a54..83f7c7baa93 100644 --- a/framework/Fur/ViewEngine/Options/ViewEngineCompilationOptions.cs +++ b/framework/Fur/ViewEngine/Options/ViewEngineCompilationOptions.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/ViewEngine/Templates/IViewEngineCompiledTemplate.cs b/framework/Fur/ViewEngine/Templates/IViewEngineCompiledTemplate.cs index f897fd86d97..2f12452b18f 100644 --- a/framework/Fur/ViewEngine/Templates/IViewEngineCompiledTemplate.cs +++ b/framework/Fur/ViewEngine/Templates/IViewEngineCompiledTemplate.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/ViewEngine/Templates/IViewEngineTemplate.cs b/framework/Fur/ViewEngine/Templates/IViewEngineTemplate.cs index ca0bf8c79ea..438d3334fe9 100644 --- a/framework/Fur/ViewEngine/Templates/IViewEngineTemplate.cs +++ b/framework/Fur/ViewEngine/Templates/IViewEngineTemplate.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/ViewEngine/Templates/ViewEngineCompiledTemplate.cs b/framework/Fur/ViewEngine/Templates/ViewEngineCompiledTemplate.cs index 0f3892f953a..59bb39df255 100644 --- a/framework/Fur/ViewEngine/Templates/ViewEngineCompiledTemplate.cs +++ b/framework/Fur/ViewEngine/Templates/ViewEngineCompiledTemplate.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/ViewEngine/Templates/ViewEngineTemplate.cs b/framework/Fur/ViewEngine/Templates/ViewEngineTemplate.cs index 4668590189d..11042633885 100644 --- a/framework/Fur/ViewEngine/Templates/ViewEngineTemplate.cs +++ b/framework/Fur/ViewEngine/Templates/ViewEngineTemplate.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/framework/Fur/ViewEngine/ViewEngine.cs b/framework/Fur/ViewEngine/ViewEngine.cs index b342b3eb4d8..302b9b4644f 100644 --- a/framework/Fur/ViewEngine/ViewEngine.cs +++ b/framework/Fur/ViewEngine/ViewEngine.cs @@ -4,7 +4,7 @@ // // 框架名称:Fur // 框架作者:百小僧 -// 框架版本:1.0.0-rc2.2020.10.14 +// 框架版本:1.0.0-rc.final // 官方网站:https://chinadot.net // 源码地址:Gitee:https://gitee.com/monksoul/Fur // Github:https://github.com/monksoul/Fur diff --git a/handbook/blog/2020-08-19-welcome.mdx b/handbook/blog/2020-08-19-welcome.mdx index 5d64ad80736..6ee49cc0e97 100644 --- a/handbook/blog/2020-08-19-welcome.mdx +++ b/handbook/blog/2020-08-19-welcome.mdx @@ -19,7 +19,7 @@ import useBaseUrl from "@docusaurus/useBaseUrl";
-[![star](https://gitee.com/monksoul/Fur/badge/star.svg?theme=gvp)](https://gitee.com/monksoul/Fur/stargazers) [![fork](https://gitee.com/monksoul/Fur/badge/fork.svg?theme=gvp)](https://gitee.com/monksoul/Fur/members) [![GitHub stars](https://img.shields.io/github/stars/MonkSoul/Fur?logo=github)](https://github.com/MonkSoul/Fur/stargazers) [![GitHub forks](https://img.shields.io/github/forks/MonkSoul/Fur?logo=github)](https://github.com/MonkSoul/Fur/network) [![GitHub license](https://img.shields.io/github/license/MonkSoul/Fur)](https://github.com/MonkSoul/Fur/blob/main/LICENSE) [![nuget](https://img.shields.io/badge/Nuget-1.0.0--rc2-brightgreen)](https://www.nuget.org/packages/Fur) +[![star](https://gitee.com/monksoul/Fur/badge/star.svg?theme=gvp)](https://gitee.com/monksoul/Fur/stargazers) [![fork](https://gitee.com/monksoul/Fur/badge/fork.svg?theme=gvp)](https://gitee.com/monksoul/Fur/members) [![GitHub stars](https://img.shields.io/github/stars/MonkSoul/Fur?logo=github)](https://github.com/MonkSoul/Fur/stargazers) [![GitHub forks](https://img.shields.io/github/forks/MonkSoul/Fur?logo=github)](https://github.com/MonkSoul/Fur/network) [![GitHub license](https://img.shields.io/github/license/MonkSoul/Fur)](https://github.com/MonkSoul/Fur/blob/main/LICENSE) [![nuget](https://img.shields.io/badge/Nuget-1.0.0--rc.final-blue)](https://www.nuget.org/packages/Fur)
@@ -82,7 +82,7 @@ import useBaseUrl from "@docusaurus/useBaseUrl"; - `Docker Hub` 线上镜像 ```shell -docker run --name fur -p 5000:80 monksoul/fur:v1.0.0-2020.10.14 +docker run --name fur -p 5000:80 monksoul/fur:v1.0.0-rc.final ``` - `手动` 打包镜像 @@ -90,13 +90,13 @@ docker run --name fur -p 5000:80 monksoul/fur:v1.0.0-2020.10.14 打开 `CMD/Shell/PowerShell` 进入 `Fur` 项目根目录打包 `Fur` 镜像: ```shell -docker build -t fur:v1.0.0-2020.10.14 . +docker build -t fur:v1.0.0-rc.final . ``` 打包成功后,直接 `docker run`: ```shell -docker run --name fur -p 5000:80 fur:v1.0.0-2020.10.14 +docker run --name fur -p 5000:80 fur:v1.0.0-rc.final ``` ## 🥞 架构设计 diff --git a/handbook/build/3ab56fdf.2056ea25.js b/handbook/build/3ab56fdf.2056ea25.js new file mode 100644 index 00000000000..33a4f8f58f3 --- /dev/null +++ b/handbook/build/3ab56fdf.2056ea25.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{142:function(e,t,a){"use strict";a.d(t,"a",(function(){return u})),a.d(t,"b",(function(){return j}));var r=a(0),n=a.n(r);function b(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function c(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var b=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=n.a.createContext({}),o=function(e){var t=n.a.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},u=function(e){var t=o(e.components);return n.a.createElement(p.Provider,{value:t},e.children)},O={inlineCode:"code",wrapper:function(e){var t=e.children;return n.a.createElement(n.a.Fragment,{},t)}},m=n.a.forwardRef((function(e,t){var a=e.components,r=e.mdxType,b=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=o(a),m=r,j=u["".concat(c,".").concat(m)]||u[m]||O[m]||b;return a?n.a.createElement(j,l(l({ref:t},p),{},{components:a})):n.a.createElement(j,l({ref:t},p))}));function j(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var b=a.length,c=new Array(b);c[0]=m;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l.mdxType="string"==typeof e?e:r,c[1]=l;for(var p=2;p=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var b=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=n.a.createContext({}),o=function(e){var t=n.a.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},u=function(e){var t=o(e.components);return n.a.createElement(p.Provider,{value:t},e.children)},O={inlineCode:"code",wrapper:function(e){var t=e.children;return n.a.createElement(n.a.Fragment,{},t)}},m=n.a.forwardRef((function(e,t){var a=e.components,r=e.mdxType,b=e.originalType,c=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),u=o(a),m=r,g=u["".concat(c,".").concat(m)]||u[m]||O[m]||b;return a?n.a.createElement(g,l(l({ref:t},p),{},{components:a})):n.a.createElement(g,l({ref:t},p))}));function g(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var b=a.length,c=new Array(b);c[0]=m;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l.mdxType="string"==typeof e?e:r,c[1]=l;for(var p=2;p Page Not Found | Fur - +

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- + \ No newline at end of file diff --git a/handbook/build/4c30b939.7af2ecca.js b/handbook/build/4c30b939.7af2ecca.js deleted file mode 100644 index 96673d0df10..00000000000 --- a/handbook/build/4c30b939.7af2ecca.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{142:function(e,t,a){"use strict";a.d(t,"a",(function(){return u})),a.d(t,"b",(function(){return j}));var r=a(0),n=a.n(r);function b(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function c(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function i(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var b=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=n.a.createContext({}),o=function(e){var t=n.a.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=o(e.components);return n.a.createElement(p.Provider,{value:t},e.children)},O={inlineCode:"code",wrapper:function(e){var t=e.children;return n.a.createElement(n.a.Fragment,{},t)}},m=n.a.forwardRef((function(e,t){var a=e.components,r=e.mdxType,b=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=o(a),m=r,j=u["".concat(c,".").concat(m)]||u[m]||O[m]||b;return a?n.a.createElement(j,i(i({ref:t},p),{},{components:a})):n.a.createElement(j,i({ref:t},p))}));function j(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var b=a.length,c=new Array(b);c[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i.mdxType="string"==typeof e?e:r,c[1]=i;for(var p=2;p=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var b=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=n.a.createContext({}),o=function(e){var t=n.a.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=o(e.components);return n.a.createElement(p.Provider,{value:t},e.children)},O={inlineCode:"code",wrapper:function(e){var t=e.children;return n.a.createElement(n.a.Fragment,{},t)}},m=n.a.forwardRef((function(e,t){var a=e.components,r=e.mdxType,b=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=o(a),m=r,j=u["".concat(c,".").concat(m)]||u[m]||O[m]||b;return a?n.a.createElement(j,i(i({ref:t},p),{},{components:a})):n.a.createElement(j,i({ref:t},p))}));function j(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var b=a.length,c=new Array(b);c[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i.mdxType="string"==typeof e?e:r,c[1]=i;for(var p=2;p=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var b=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=n.a.createContext({}),o=function(e){var t=n.a.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},u=function(e){var t=o(e.components);return n.a.createElement(p.Provider,{value:t},e.children)},O={inlineCode:"code",wrapper:function(e){var t=e.children;return n.a.createElement(n.a.Fragment,{},t)}},m=n.a.forwardRef((function(e,t){var a=e.components,r=e.mdxType,b=e.originalType,c=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=o(a),m=r,j=u["".concat(c,".").concat(m)]||u[m]||O[m]||b;return a?n.a.createElement(j,i(i({ref:t},p),{},{components:a})):n.a.createElement(j,i({ref:t},p))}));function j(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var b=a.length,c=new Array(b);c[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i.mdxType="string"==typeof e?e:r,c[1]=i;for(var p=2;pMapster \u4f7f\u7528",id:"123-mapster-\u4f7f\u7528",children:[{value:"12.3.1 \u6781\u6613\u5165\u95e8",id:"1231-\u6781\u6613\u5165\u95e8",children:[]},{value:"12.3.2 \u81ea\u5b9a\u4e49\u6620\u5c04\u89c4\u5219",id:"1232-\u81ea\u5b9a\u4e49\u6620\u5c04\u89c4\u5219",children:[]},{value:"12.3.3 \u4f9d\u8d56\u6ce8\u5165\u65b9\u5f0f",id:"1233-\u4f9d\u8d56\u6ce8\u5165\u65b9\u5f0f",children:[]},{value:"12.3.4 \u548c EFCore \u914d\u5408",id:"1234-\u548c-efcore-\u914d\u5408",children:[]}]},{value:"12.4 \u53cd\u9988\u4e0e\u5efa\u8bae",id:"124-\u53cd\u9988\u4e0e\u5efa\u8bae",children:[]}],b={rightToc:o};function s(e){var t=e.components,n=Object(r.a)(e,["components"]);return Object(c.b)("wrapper",Object(a.a)({},b,n,{components:t,mdxType:"MDXLayout"}),Object(c.b)("h2",{id:"121-\u5bf9\u8c61\u6620\u5c04"},"12.1 \u5bf9\u8c61\u6620\u5c04"),Object(c.b)("p",null,"\u7b80\u5355\u6765\u8bf4\uff0c\u5c31\u662f\u5c06\u4e00\u4e2a\u5bf9\u8c61\u7684\u6570\u636e\u6839\u636e\u7279\u5b9a\u89c4\u5219\u6279\u91cf\u6620\u5c04\u5230\u53e6\u4e00\u4e2a\u5bf9\u8c61\u4e2d\uff0c\u51cf\u5c11\u624b\u5de5\u64cd\u4f5c\u548c\u964d\u4f4e\u4eba\u4e3a\u51fa\u9519\u7387\u3002\u5982\u5c06 ",Object(c.b)("inlineCode",{parentName:"p"},"DTO")," \u5bf9\u8c61\u6620\u5c04\u5230 ",Object(c.b)("inlineCode",{parentName:"p"},"Entity")," \u5b9e\u4f53\u4e2d\uff0c\u53cd\u4e4b\u4ea6\u7136\u3002"),Object(c.b)("h2",{id:"122-\u5148\u770b\u4f8b\u5b50"},"12.2 \u5148\u770b\u4f8b\u5b50"),Object(c.b)("p",null,"\u5728\u8fc7\u53bb\uff0c\u6211\u4eec\u9700\u8981\u5c06\u4e00\u4e2a\u5bf9\u8c61\u7684\u503c\u8f6c\u6362\u5230\u53e6\u4e00\u4e2a\u5bf9\u8c61\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u8fd9\u6837\u505a\uff0c\u5982\uff1a"),Object(c.b)("pre",null,Object(c.b)("code",Object(a.a)({parentName:"pre"},{className:"language-cs"}),'var entity = repository.Find(1);\n\nvar dto = new Dto();\ndto.Id = entity.Id;\ndto.Name = entity.Name;\ndto.Age = entity.Age;\ndto.Address = entity.Address;\ndto.FullName = entity.FirstName + entity.LastName;\ndto.IdCard = entity.IdCard.Replace("1234", "****");\n')),Object(c.b)("p",null,"\u4e0a\u9762\u7684\u4f8b\u5b50\u4f3c\u4e4e\u6ca1\u6709\u4efb\u4f55\u95ee\u9898\uff0c\u4f46\u662f\u5982\u679c\u5f88\u591a\u5730\u65b9\u9700\u8981\u8fd9\u6837\u7684\u8d4b\u503c\u64cd\u4f5c\u3001\u6216\u8005\u76f8\u540c\u7684\u8d4b\u503c\u64cd\u4f5c\u5728\u591a\u4e2a\u5730\u65b9\u4f7f\u7528\uff0c\u53c8\u6216\u8005\u4e00\u4e2a\u7c7b\u4e2d\u542b\u6709\u975e\u5e38\u591a\u7684\u5c5e\u6027\u6216\u81ea\u5b9a\u4e49\u8d4b\u503c\u64cd\u4f5c\u3002\u90a3\u4e48\u8fd9\u6837\u7684\u64cd\u4f5c\u6548\u7387\u6781\u4f4e\uff0c\u5bb9\u6613\u51fa\u9519\uff0c\u4e14\u4ee3\u7801\u975e\u5e38\u81c3\u80bf\u548c\u5197\u4f59\u3002"),Object(c.b)("p",null,"\u6240\u4ee5\uff0c\u5b9e\u73b0\u81ea\u52a8\u6620\u5c04\u8d4b\u503c\u548c\u652f\u6301\u7279\u6b8a\u914d\u7f6e\u7684\u9700\u6c42\u5c31\u6709\u4e86\u3002\u76ee\u524d ",Object(c.b)("inlineCode",{parentName:"p"},"C#")," \u5e73\u53f0\u6709\u4e24\u4e2a\u4f18\u79c0\u7684\u5bf9\u8c61\u6620\u5c04\u5de5\u5177\uff1a",Object(c.b)("inlineCode",{parentName:"p"},"Mapster")," \u548c ",Object(c.b)("inlineCode",{parentName:"p"},"AutoMapper"),"\u3002",Object(c.b)("strong",{parentName:"p"},"\u5728 ",Object(c.b)("inlineCode",{parentName:"strong"},"Fur")," \u6846\u67b6\u4e2d\uff0c\u9ed8\u8ba4\u96c6\u6210\u7684\u662f ",Object(c.b)("a",Object(a.a)({parentName:"strong"},{href:"https://github.com/MapsterMapper/Mapster"}),"Mapster"),"\uff0c",Object(c.b)("a",Object(a.a)({parentName:"strong"},{href:"https://github.com/MapsterMapper/Mapster"}),"Mapster")," \u662f\u4e00\u6b3e\u6781\u6613\u4f7f\u7528\u4e14\u8d85\u9ad8\u6027\u80fd\u7684\u5bf9\u8c61\u6620\u5c04\u6846\u67b6\u3002")),Object(c.b)("h2",{id:"123-mapster-\u4f7f\u7528"},"12.3 ",Object(c.b)("inlineCode",{parentName:"h2"},"Mapster")," \u4f7f\u7528"),Object(c.b)("p",null,"\u73b0\u5728\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7 ",Object(c.b)("inlineCode",{parentName:"p"},"Mapster")," \u63d0\u4f9b\u7684\u5bf9\u8c61\u6620\u5c04\u65b9\u6cd5\uff1a",Object(c.b)("inlineCode",{parentName:"p"},"Adapt")," \u65b9\u6cd5\u6539\u9020\u4e0a\u9762\u7684\u4f8b\u5b50\uff1a"),Object(c.b)("h3",{id:"1231-\u6781\u6613\u5165\u95e8"},"12.3.1 \u6781\u6613\u5165\u95e8"),Object(c.b)("pre",null,Object(c.b)("code",Object(a.a)({parentName:"pre"},{className:"language-cs"}),"var entity = repository.Find(1);\nvar dto = entity.Adapt();\n")),Object(c.b)("p",null,"\u4ec5\u4ec5\u4e00\u884c\u4ee3\u7801\u5c31\u53ef\u4ee5\u5b9e\u73b0 ",Object(c.b)("inlineCode",{parentName:"p"},"entity -> dto")," \u7684\u8f6c\u6362\uff0c\u5982\u679c\u6d89\u53ca\u5230\u8d4b\u503c\u7684\u590d\u5236\u64cd\u4f5c\uff0c\u5982 ",Object(c.b)("inlineCode",{parentName:"p"},"dto.FullName")," \u548c ",Object(c.b)("inlineCode",{parentName:"p"},"dto.IdCard"),"\uff0c\u6211\u4eec\u53ea\u9700\u8981\u81ea\u5b9a\u4e49\u6620\u5c04\u89c4\u5219\u7c7b\u5373\u53ef\u3002"),Object(c.b)("h3",{id:"1232-\u81ea\u5b9a\u4e49\u6620\u5c04\u89c4\u5219"},"12.3.2 \u81ea\u5b9a\u4e49\u6620\u5c04\u89c4\u5219"),Object(c.b)("pre",null,Object(c.b)("code",Object(a.a)({parentName:"pre"},{className:"language-cs",metastring:"{1,7,11-13}","{1,7,11-13}":!0}),'using Fur.ObjectMapper;\nusing Mapster;\nusing System;\n\nnamespace Fur.Application\n{\n public class Mapper : IObjectMapper\n {\n public void Register(TypeAdapterConfig config)\n {\n config.ForType()\n .Map(dest => dest.FullName, src => src.FirstName + src.LastName)\n .Map(dest => dest.IdCard, src => src.IdCard.Replace("1234", "****"));\n }\n }\n}\n')),Object(c.b)("div",{className:"admonition admonition-tip alert alert--success"},Object(c.b)("div",Object(a.a)({parentName:"div"},{className:"admonition-heading"}),Object(c.b)("h5",{parentName:"div"},Object(c.b)("span",Object(a.a)({parentName:"h5"},{className:"admonition-icon"}),Object(c.b)("svg",Object(a.a)({parentName:"span"},{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"16",viewBox:"0 0 12 16"}),Object(c.b)("path",Object(a.a)({parentName:"svg"},{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})))),"\u5c0f\u77e5\u8bc6")),Object(c.b)("div",Object(a.a)({parentName:"div"},{className:"admonition-content"}),Object(c.b)("p",{parentName:"div"},"\u8be5\u6620\u5c04\u6587\u4ef6 ",Object(c.b)("inlineCode",{parentName:"p"},"Mapper.cs")," \u53ef\u4ee5\u653e\u5728\u4efb\u4f55\u9879\u76ee\u6216\u6587\u4ef6\u5939\u4e2d\uff0c",Object(c.b)("inlineCode",{parentName:"p"},"Fur")," \u4f1a\u5728\u7a0b\u5e8f\u542f\u52a8\u7684\u65f6\u5019\u81ea\u52a8\u626b\u63cf\u5e76\u6ce8\u5165\u914d\u7f6e\u3002"))),Object(c.b)("h3",{id:"1233-\u4f9d\u8d56\u6ce8\u5165\u65b9\u5f0f"},"12.3.3 \u4f9d\u8d56\u6ce8\u5165\u65b9\u5f0f"),Object(c.b)("p",null,Object(c.b)("inlineCode",{parentName:"p"},"Mapster")," \u9664\u4e86\u63d0\u4f9b ",Object(c.b)("inlineCode",{parentName:"p"},"Adapt")," \u62d3\u5c55\u65b9\u6cd5\u4ee5\u5916\uff0c\u540c\u65f6\u8fd8\u63d0\u4f9b\u4f9d\u8d56\u6ce8\u5165\u7684\u65b9\u5f0f\u3002"),Object(c.b)("pre",null,Object(c.b)("code",Object(a.a)({parentName:"pre"},{className:"language-cs"}),"public class Person(IMapper mapper)\n{\n var dto = _mapper.Map(entity);\n}\n")),Object(c.b)("h3",{id:"1234-\u548c-efcore-\u914d\u5408"},"12.3.4 \u548c ",Object(c.b)("inlineCode",{parentName:"h3"},"EFCore")," \u914d\u5408"),Object(c.b)("p",null,Object(c.b)("inlineCode",{parentName:"p"},"Mapster")," \u8fd8\u63d0\u4f9b\u4e86 ",Object(c.b)("inlineCode",{parentName:"p"},"ProjectToType")," Linq \u62d3\u5c55\u65b9\u6cd5\u51cf\u5c11\u6211\u4eec\u624b\u52a8 ",Object(c.b)("inlineCode",{parentName:"p"},"Select")," \u64cd\u4f5c\uff0c\u5982\uff1a"),Object(c.b)("p",null,"\u6b63\u5e38\u7684\u64cd\u4f5c\uff1a"),Object(c.b)("pre",null,Object(c.b)("code",Object(a.a)({parentName:"pre"},{className:"language-cs"}),"var destinations = context.Sources\n .Select(c => new Destination {\n Id = p.Id,\n Name = p.Name,\n Surname = p.Surname,\n ....\n })\n .ToList();\n")),Object(c.b)("p",null,"\u4f7f\u7528 ",Object(c.b)("inlineCode",{parentName:"p"},"Mapster")," \u4e4b\u540e\uff1a"),Object(c.b)("pre",null,Object(c.b)("code",Object(a.a)({parentName:"pre"},{className:"language-cs"})," var destinations = context.Sources.ProjectToType().ToList();\n")),Object(c.b)("h2",{id:"124-\u53cd\u9988\u4e0e\u5efa\u8bae"},"12.4 \u53cd\u9988\u4e0e\u5efa\u8bae"),Object(c.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(c.b)("div",Object(a.a)({parentName:"div"},{className:"admonition-heading"}),Object(c.b)("h5",{parentName:"div"},Object(c.b)("span",Object(a.a)({parentName:"h5"},{className:"admonition-icon"}),Object(c.b)("svg",Object(a.a)({parentName:"span"},{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"}),Object(c.b)("path",Object(a.a)({parentName:"svg"},{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})))),"\u4e0e\u6211\u4eec\u4ea4\u6d41")),Object(c.b)("div",Object(a.a)({parentName:"div"},{className:"admonition-content"}),Object(c.b)("p",{parentName:"div"},"\u7ed9 Fur \u63d0 ",Object(c.b)("a",Object(a.a)({parentName:"p"},{href:"https://gitee.com/monksoul/Fur/issues/new?issue"}),"Issue"),"\u3002"))),Object(c.b)("hr",null),Object(c.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(c.b)("div",Object(a.a)({parentName:"div"},{className:"admonition-heading"}),Object(c.b)("h5",{parentName:"div"},Object(c.b)("span",Object(a.a)({parentName:"h5"},{className:"admonition-icon"}),Object(c.b)("svg",Object(a.a)({parentName:"span"},{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"}),Object(c.b)("path",Object(a.a)({parentName:"svg"},{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})))),"\u4e86\u89e3\u66f4\u591a")),Object(c.b)("div",Object(a.a)({parentName:"div"},{className:"admonition-content"}),Object(c.b)("p",{parentName:"div"},"\u60f3\u4e86\u89e3\u66f4\u591a ",Object(c.b)("inlineCode",{parentName:"p"},"Mapster")," \u77e5\u8bc6\u53ef\u67e5\u9605 ",Object(c.b)("a",Object(a.a)({parentName:"p"},{href:"https://github.com/MapsterMapper/Mapster/wiki"}),"Mapster - Wiki")," \u6587\u6863\u3002"))))}s.isMDXComponent=!0},142:function(e,t,n){"use strict";n.d(t,"a",(function(){return d})),n.d(t,"b",(function(){return O}));var a=n(0),r=n.n(a);function c(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function p(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var b=r.a.createContext({}),s=function(e){var t=r.a.useContext(b),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},d=function(e){var t=s(e.components);return r.a.createElement(b.Provider,{value:t},e.children)},l={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},m=r.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,c=e.originalType,i=e.parentName,b=o(e,["components","mdxType","originalType","parentName"]),d=s(n),m=a,O=d["".concat(i,".").concat(m)]||d[m]||l[m]||c;return n?r.a.createElement(O,p(p({ref:t},b),{},{components:n})):r.a.createElement(O,p({ref:t},b))}));function O(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var c=n.length,i=new Array(c);i[0]=m;var p={};for(var o in t)hasOwnProperty.call(t,o)&&(p[o]=t[o]);p.originalType=e,p.mdxType="string"==typeof e?e:a,i[1]=p;for(var b=2;b=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=a.a.createContext({}),u=function(e){var t=a.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},b=function(e){var t=u(e.components);return a.a.createElement(l.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},s=a.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,c=e.parentName,l=p(e,["components","mdxType","originalType","parentName"]),b=u(n),s=r,m=b["".concat(c,".").concat(s)]||b[s]||d[s]||o;return n?a.a.createElement(m,i(i({ref:t},l),{},{components:n})):a.a.createElement(m,i({ref:t},l))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,c=new Array(o);c[0]=s;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i.mdxType="string"==typeof e?e:r,c[1]=i;for(var l=2;l\n \n
\n')),Object(o.b)("p",null,"\u5b8c\u6574\u4ee3\u7801\u5982\u4e0b\uff1a"),Object(o.b)("pre",null,Object(o.b)("code",Object(r.a)({parentName:"pre"},{className:"language-xml",metastring:"{17-19}","{17-19}":!0}),'\n\n \n net5.0\n 1701;1702;1591\n Fur.Core.xml\n \n\n \n \n \n\n \n \n \n\n \n \n \n\n\n\n')),Object(o.b)("p",null,"\u6240\u6709\u65b0\u5efa\u9879\u76ee\u90fd\u9700\u6dfb\u52a0 ",Object(o.b)("inlineCode",{parentName:"p"},"\u4e0a\u8ff0\u9ad8\u4eae\u4ee3\u7801"),"\uff0c\u65b9\u53ef\u4f7f\u7528 ",Object(o.b)("inlineCode",{parentName:"p"},"Fur")," \u5168\u90e8\u529f\u80fd\u3002"),Object(o.b)("h2",{id:"143-\u53cd\u9988\u4e0e\u5efa\u8bae"},"1.4.3 \u53cd\u9988\u4e0e\u5efa\u8bae"),Object(o.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(o.b)("div",Object(r.a)({parentName:"div"},{className:"admonition-heading"}),Object(o.b)("h5",{parentName:"div"},Object(o.b)("span",Object(r.a)({parentName:"h5"},{className:"admonition-icon"}),Object(o.b)("svg",Object(r.a)({parentName:"span"},{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"}),Object(o.b)("path",Object(r.a)({parentName:"svg"},{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})))),"\u4e0e\u6211\u4eec\u4ea4\u6d41")),Object(o.b)("div",Object(r.a)({parentName:"div"},{className:"admonition-content"}),Object(o.b)("p",{parentName:"div"},"\u7ed9 Fur \u63d0 ",Object(o.b)("a",Object(r.a)({parentName:"p"},{href:"https://gitee.com/monksoul/Fur/issues/new?issue"}),"Issue"),"\u3002"))))}p.isMDXComponent=!0},142:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return d}));var r=n(0),a=n.n(r);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function c(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var b=a.a.createContext({}),p=function(e){var t=a.a.useContext(b),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=p(e.components);return a.a.createElement(b.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},s=a.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,i=e.parentName,b=l(e,["components","mdxType","originalType","parentName"]),u=p(n),s=r,d=u["".concat(i,".").concat(s)]||u[s]||m[s]||o;return n?a.a.createElement(d,c(c({ref:t},b),{},{components:n})):a.a.createElement(d,c({ref:t},b))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=s;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var b=2;bFur \u529f\u80fd",id:"142-\u96c6\u6210-fur-\u529f\u80fd",children:[]},{value:"1.4.3 \u53cd\u9988\u4e0e\u5efa\u8bae",id:"143-\u53cd\u9988\u4e0e\u5efa\u8bae",children:[]}],b={rightToc:l};function u(e){var n=e.components,t=Object(a.a)(e,["components"]);return Object(i.b)("wrapper",Object(r.a)({},b,t,{components:n,mdxType:"MDXLayout"}),Object(i.b)("h2",{id:"141-\u5173\u4e8e\u9879\u76ee\u5f15\u7528"},"1.4.1 \u5173\u4e8e\u9879\u76ee\u5f15\u7528"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"Fur")," \u6846\u67b6\u9ed8\u8ba4\u91c7\u7528\u591a\u5c42\u9879\u76ee\u8bbe\u8ba1\u67b6\u6784\uff0c\u6bcf\u4e00\u4e2a\u9879\u76ee\u5c42\u7684\u4f9d\u8d56\u5206\u522b\u662f\uff1a"),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},Object(i.b)("inlineCode",{parentName:"li"},"Fur"),"\uff1a\u6838\u5fc3\u5c42\uff0c\u65e0\u9879\u76ee\u4f9d\u8d56"),Object(i.b)("li",{parentName:"ul"},Object(i.b)("inlineCode",{parentName:"li"},"Fur.Application"),"\uff1a\u6dfb\u52a0 ",Object(i.b)("inlineCode",{parentName:"li"},"Fur.Core")," \u5f15\u7528"),Object(i.b)("li",{parentName:"ul"},Object(i.b)("inlineCode",{parentName:"li"},"Fur.Core"),"\uff1a\u6dfb\u52a0 ",Object(i.b)("inlineCode",{parentName:"li"},"Fur")," \u5f15\u7528"),Object(i.b)("li",{parentName:"ul"},Object(i.b)("inlineCode",{parentName:"li"},"Fur.Database.Migrations"),"\uff1a\u6dfb\u52a0 ",Object(i.b)("inlineCode",{parentName:"li"},"Fur.EntityFramework.Core")," \u5f15\u7528"),Object(i.b)("li",{parentName:"ul"},Object(i.b)("inlineCode",{parentName:"li"},"Fur.EntityFramework.Core"),"\uff1a\u6dfb\u52a0 ",Object(i.b)("inlineCode",{parentName:"li"},"Fur.Core")," \u5f15\u7528"),Object(i.b)("li",{parentName:"ul"},Object(i.b)("inlineCode",{parentName:"li"},"Fur.Web.Core"),"\uff1a\u6dfb\u52a0 ",Object(i.b)("inlineCode",{parentName:"li"},"Fur.Application"),"\uff0c",Object(i.b)("inlineCode",{parentName:"li"},"Fur.Database.Migrations")," \u5f15\u7528"),Object(i.b)("li",{parentName:"ul"},Object(i.b)("inlineCode",{parentName:"li"},"Fur.Web.Entry"),"\uff1a\u6dfb\u52a0 ",Object(i.b)("inlineCode",{parentName:"li"},"Fur.Web.Core")," \u5f15\u7528 \u548c ",Object(i.b)("inlineCode",{parentName:"li"},"Microsoft.EntityFrameworkCore.Tools")," \u5305")),Object(i.b)("p",null,"\u5982\u679c\u5f00\u53d1\u8005\u642d\u5efa\u81ea\u5df1\u7684\u9879\u76ee\uff0c\u5219\u53ea\u9700\u8981\u5728 ",Object(i.b)("inlineCode",{parentName:"p"},"Fur.Core")," \u5c42\u5f15\u7528 ",Object(i.b)("inlineCode",{parentName:"p"},"Nuget")," \u4e2d\u6700\u65b0\u7684 ",Object(i.b)("inlineCode",{parentName:"p"},"Fur")," \u5305\u5373\u53ef\u3002"),Object(i.b)("h2",{id:"142-\u96c6\u6210-fur-\u529f\u80fd"},"1.4.2 \u96c6\u6210 ",Object(i.b)("inlineCode",{parentName:"h2"},"Fur")," \u529f\u80fd"),Object(i.b)("p",null,"\u9879\u76ee\u642d\u5efa\u597d\u4e4b\u540e\uff0c\u96c6\u6210 ",Object(i.b)("inlineCode",{parentName:"p"},"Fur")," \u6846\u67b6\u53ea\u9700\u8981\u5728 ",Object(i.b)("inlineCode",{parentName:"p"},"Program.cs")," \u4e2d \u6dfb\u52a0 ",Object(i.b)("inlineCode",{parentName:"p"},"Inject()")," \u65b9\u6cd5\u5373\u53ef\uff1a"),Object(i.b)("pre",null,Object(i.b)("code",Object(r.a)({parentName:"pre"},{className:"language-cs",metastring:"{18}","{18}":!0}),"using Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Hosting;\n\nnamespace Fur.Web.Entry\n{\n public class Program\n {\n public static void Main(string[] args)\n {\n CreateHostBuilder(args).Build().Run();\n }\n\n public static IHostBuilder CreateHostBuilder(string[] args)\n {\n return Host.CreateDefaultBuilder(args)\n .ConfigureWebHostDefaults(webBuilder =>\n {\n webBuilder.Inject()\n .UseStartup();\n });\n }\n }\n}\n")),Object(i.b)("h2",{id:"143-\u53cd\u9988\u4e0e\u5efa\u8bae"},"1.4.3 \u53cd\u9988\u4e0e\u5efa\u8bae"),Object(i.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(i.b)("div",Object(r.a)({parentName:"div"},{className:"admonition-heading"}),Object(i.b)("h5",{parentName:"div"},Object(i.b)("span",Object(r.a)({parentName:"h5"},{className:"admonition-icon"}),Object(i.b)("svg",Object(r.a)({parentName:"span"},{xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"}),Object(i.b)("path",Object(r.a)({parentName:"svg"},{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})))),"\u4e0e\u6211\u4eec\u4ea4\u6d41")),Object(i.b)("div",Object(r.a)({parentName:"div"},{className:"admonition-content"}),Object(i.b)("p",{parentName:"div"},"\u7ed9 Fur \u63d0 ",Object(i.b)("a",Object(r.a)({parentName:"p"},{href:"https://gitee.com/monksoul/Fur/issues/new?issue"}),"Issue"),"\u3002"))))}u.isMDXComponent=!0},142:function(e,n,t){"use strict";t.d(n,"a",(function(){return p})),t.d(n,"b",(function(){return m}));var r=t(0),a=t.n(r);function i(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function c(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var b=a.a.createContext({}),u=function(e){var n=a.a.useContext(b),t=n;return e&&(t="function"==typeof e?e(n):c(c({},n),e)),t},p=function(e){var n=u(e.components);return a.a.createElement(b.Provider,{value:n},e.children)},s={inlineCode:"code",wrapper:function(e){var n=e.children;return a.a.createElement(a.a.Fragment,{},n)}},d=a.a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,i=e.originalType,o=e.parentName,b=l(e,["components","mdxType","originalType","parentName"]),p=u(t),d=r,m=p["".concat(o,".").concat(d)]||p[d]||s[d]||i;return t?a.a.createElement(m,c(c({ref:n},b),{},{components:t})):a.a.createElement(m,c({ref:n},b))}));function m(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var i=t.length,o=new Array(i);o[0]=d;var c={};for(var l in n)hasOwnProperty.call(n,l)&&(c[l]=n[l]);c.originalType=e,c.mdxType="string"==typeof e?e:r,o[1]=c;for(var b=2;b Blog | Fur - + - +
-

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

+

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

- + - + \ No newline at end of file diff --git a/handbook/build/blog/tags/fur/index.html b/handbook/build/blog/tags/fur/index.html index 0a268b9bd00..e5d36d2341a 100644 --- a/handbook/build/blog/tags/fur/index.html +++ b/handbook/build/blog/tags/fur/index.html @@ -6,26 +6,26 @@ Posts tagged "fur" | Fur - + - +
-

1 post tagged with "fur"

View All Tags

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

+

1 post tagged with "fur"

View All Tags

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

- + - + \ No newline at end of file diff --git a/handbook/build/blog/tags/furos/index.html b/handbook/build/blog/tags/furos/index.html index 745f2f1becf..6acbf67ce94 100644 --- a/handbook/build/blog/tags/furos/index.html +++ b/handbook/build/blog/tags/furos/index.html @@ -6,26 +6,26 @@ Posts tagged "furos" | Fur - + - +
-

1 post tagged with "furos"

View All Tags

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

+

1 post tagged with "furos"

View All Tags

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

- + - + \ No newline at end of file diff --git a/handbook/build/blog/tags/index.html b/handbook/build/blog/tags/index.html index 3fed0179192..5048b0f26c6 100644 --- a/handbook/build/blog/tags/index.html +++ b/handbook/build/blog/tags/index.html @@ -6,7 +6,7 @@ Tags | Fur - + @@ -17,7 +17,7 @@ - + diff --git a/handbook/build/blog/tags/net-5/index.html b/handbook/build/blog/tags/net-5/index.html index 62f4eb961ec..0a336c0d20f 100644 --- a/handbook/build/blog/tags/net-5/index.html +++ b/handbook/build/blog/tags/net-5/index.html @@ -6,26 +6,26 @@ Posts tagged ".net5" | Fur - + - +
-

1 post tagged with ".net5"

View All Tags

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

+

1 post tagged with ".net5"

View All Tags

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

- + - + \ No newline at end of file diff --git a/handbook/build/blog/tags/net/index.html b/handbook/build/blog/tags/net/index.html index c64f64b8c96..764e43b24a7 100644 --- a/handbook/build/blog/tags/net/index.html +++ b/handbook/build/blog/tags/net/index.html @@ -6,26 +6,26 @@ Posts tagged ".net" | Fur - + - +
-

1 post tagged with ".net"

View All Tags

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

+

1 post tagged with ".net"

View All Tags

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

- + - + \ No newline at end of file diff --git a/handbook/build/blog/tags/netcore/index.html b/handbook/build/blog/tags/netcore/index.html index 3cb8faf79b0..06ee58f8edb 100644 --- a/handbook/build/blog/tags/netcore/index.html +++ b/handbook/build/blog/tags/netcore/index.html @@ -6,26 +6,26 @@ Posts tagged ".netcore" | Fur - + - +
-

1 post tagged with ".netcore"

View All Tags

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

+

1 post tagged with ".netcore"

View All Tags

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

- + - + \ No newline at end of file diff --git a/handbook/build/blog/welcome/index.html b/handbook/build/blog/welcome/index.html index aa8aee0efa8..2411c1b7e17 100644 --- a/handbook/build/blog/welcome/index.html +++ b/handbook/build/blog/welcome/index.html @@ -6,24 +6,24 @@ Fur 介绍 | Fur - + - +
-

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

🌭 开源地址

🍿 Docker 镜像

  • Docker Hub 线上镜像
docker run --name fur -p 5000:80 monksoul/fur:v1.0.0-2020.10.14
  • 手动 打包镜像

打开 CMD/Shell/PowerShell 进入 Fur 项目根目录打包 Fur 镜像:

docker build -t fur:v1.0.0-2020.10.14 .

打包成功后,直接 docker run

docker run --name fur -p 5000:80 fur:v1.0.0-2020.10.14

🥞 架构设计

正在整理中...

🥝 功能模块

🥐 框架依赖

Fur 为了追求极速入门,极致性能,尽可能的不使用或减少第三方依赖。目前 Fur 仅集成了以下三个依赖:

麻雀虽小五脏俱全。Fur 即使只集成了这三个依赖,但是主流的 依赖注入/控制反转AOP 面向切面编程,事件总线数据验证数据库操作 等等一个都不少。

🥗 环境要求

  • Visual Studio 2019 Preview 16.8 +
  • .NET 5 SDK +
  • .Net Standard 2.1 +

🥪 支持平台

  • 运行环境
    • Windows
    • Linux
    • MacOS
    • Docker/K8S/K3S/Rancher
    • Xamarin/MAUI
  • 数据库
    • SqlServer
    • Sqlite
    • Azure Cosmos
    • MySql
    • PostgreSQL
    • InMemoryDatabase
    • Oracle
    • Firebird
    • 达梦数据库
  • 应用部署
    • Kestrel
    • Nginx
    • Jexus
    • IIS
    • Apache
    • PM2
    • Supervisor
    • 单文件
    • 容器(Docker/K8S/K3S/Rancher)

🍖 关于性能

Fur 目前采用 Visual Studio 2019 Preview 16.8 自带性能测试和 JMeter 进行测试,由于篇幅有限,只贴部分测试图,测试结果如下:


🍚 关于作者

一个拥有 12 年开发经验 .NETer。喜欢分享,喜欢新技术,在互联网多个技术领域皆有涉猎。

🍤 项目成员

🎈 欢迎更多的开发者加入 Fur 大家庭。

🍝 他们都在用

  • 百签科技(广东)有限公司
  • 码为科技(广州)有限公司
  • 广州启顺国际货运代理有限公司
  • 森丰供应链服务(广州)有限公司
  • 中山赢友网络科技有限公司
  • 中山模思软件科技有限公司
  • 珠海市恒泰新软件有限责任公司
  • 珠海思诺锐创软件有限公司
  • 深圳市易胜科技有限公司
  • 重庆虫儿飞科技有限公司
  • 重庆林木森科技有限公司
  • 深圳市品立方科技有限公司

如果您的项目使用到 Fur 开发,可以告诉我们。

🍻 贡献代码

Fur 遵循 Apache-2.0 开源协议,欢迎大家提交 PRIssue

如果要为项目做出贡献,请查看贡献指南。

🍍 捐赠列表

注:排序按捐赠顺序书写

捐赠人昵称捐赠金额(元)附语
🤴 爱吃油麦菜100感谢您的开源项目!
👳‍♂️ 麦壳饼200感谢您的开源项目!
👨 Sun100感谢您的开源项目!
👶 d61761720感谢您的开源项目!
👦 Diqiguoji00816.66见贤思齐
👲 nodyang100感谢您的开源项目!
👳‍♀️ mictxd100吹过的牛都实现。
🧓 欧流全10希望将来超越 Spring
👨‍⚕️ lionkon10...看了框架感觉拿来学习是很不错的...
😤 好人!10...Nice 的小僧,我们的 dotnetchina 马上火起来了...
😮 木木 Woody10感谢您的开源项目!

非常感谢您们的支持,正是因为您们,中国开源才可以越走越远,Fur 越走越远。

🥔 QQ 交流群

🧆 友情链接

👉 Fur 👉 SqlSugar 👉 Layx 👉 t-io 👉 ThinkPHP 👉 Hutool 👉 BootstrapAdmin 👉 BootstrapBlazor

+

Fur 介绍

dotnet中国

dotnet中国

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

🌭 开源地址

🍿 Docker 镜像

  • Docker Hub 线上镜像
docker run --name fur -p 5000:80 monksoul/fur:v1.0.0-rc.final
  • 手动 打包镜像

打开 CMD/Shell/PowerShell 进入 Fur 项目根目录打包 Fur 镜像:

docker build -t fur:v1.0.0-rc.final .

打包成功后,直接 docker run

docker run --name fur -p 5000:80 fur:v1.0.0-rc.final

🥞 架构设计

正在整理中...

🥝 功能模块

🥐 框架依赖

Fur 为了追求极速入门,极致性能,尽可能的不使用或减少第三方依赖。目前 Fur 仅集成了以下三个依赖:

麻雀虽小五脏俱全。Fur 即使只集成了这三个依赖,但是主流的 依赖注入/控制反转AOP 面向切面编程,事件总线数据验证数据库操作 等等一个都不少。

🥗 环境要求

  • Visual Studio 2019 Preview 16.8 +
  • .NET 5 SDK +
  • .Net Standard 2.1 +

🥪 支持平台

  • 运行环境
    • Windows
    • Linux
    • MacOS
    • Docker/K8S/K3S/Rancher
    • Xamarin/MAUI
  • 数据库
    • SqlServer
    • Sqlite
    • Azure Cosmos
    • MySql
    • PostgreSQL
    • InMemoryDatabase
    • Oracle
    • Firebird
    • 达梦数据库
  • 应用部署
    • Kestrel
    • Nginx
    • Jexus
    • IIS
    • Apache
    • PM2
    • Supervisor
    • 单文件
    • 容器(Docker/K8S/K3S/Rancher)

🍖 关于性能

Fur 目前采用 Visual Studio 2019 Preview 16.8 自带性能测试和 JMeter 进行测试,由于篇幅有限,只贴部分测试图,测试结果如下:


🍚 关于作者

一个拥有 12 年开发经验 .NETer。喜欢分享,喜欢新技术,在互联网多个技术领域皆有涉猎。

🍤 项目成员

🎈 欢迎更多的开发者加入 Fur 大家庭。

🍝 他们都在用

  • 百签科技(广东)有限公司
  • 码为科技(广州)有限公司
  • 广州启顺国际货运代理有限公司
  • 森丰供应链服务(广州)有限公司
  • 中山赢友网络科技有限公司
  • 中山模思软件科技有限公司
  • 珠海市恒泰新软件有限责任公司
  • 珠海思诺锐创软件有限公司
  • 深圳市易胜科技有限公司
  • 重庆虫儿飞科技有限公司
  • 重庆林木森科技有限公司
  • 深圳市品立方科技有限公司

如果您的项目使用到 Fur 开发,可以告诉我们。

🍻 贡献代码

Fur 遵循 Apache-2.0 开源协议,欢迎大家提交 PRIssue

如果要为项目做出贡献,请查看贡献指南。

🍍 捐赠列表

注:排序按捐赠顺序书写

捐赠人昵称捐赠金额(元)附语
🤴 爱吃油麦菜100感谢您的开源项目!
👳‍♂️ 麦壳饼200感谢您的开源项目!
👨 Sun100感谢您的开源项目!
👶 d61761720感谢您的开源项目!
👦 Diqiguoji00816.66见贤思齐
👲 nodyang100感谢您的开源项目!
👳‍♀️ mictxd100吹过的牛都实现。
🧓 欧流全10希望将来超越 Spring
👨‍⚕️ lionkon10...看了框架感觉拿来学习是很不错的...
😤 好人!10...Nice 的小僧,我们的 dotnetchina 马上火起来了...
😮 木木 Woody10感谢您的开源项目!

非常感谢您们的支持,正是因为您们,中国开源才可以越走越远,Fur 越走越远。

🥔 QQ 交流群

🧆 友情链接

👉 Fur 👉 SqlSugar 👉 Layx 👉 t-io 👉 ThinkPHP 👉 Hutool 👉 BootstrapAdmin 👉 BootstrapBlazor

- + - + \ No newline at end of file diff --git a/handbook/build/d3c206bc.2684bdea.js b/handbook/build/d3c206bc.2684bdea.js deleted file mode 100644 index 77241add5fb..00000000000 --- a/handbook/build/d3c206bc.2684bdea.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[65],{119:function(e,t,r){"use strict";r.r(t),r.d(t,"frontMatter",(function(){return b})),r.d(t,"metadata",(function(){return i})),r.d(t,"rightToc",(function(){return u})),r.d(t,"default",(function(){return l}));var n=r(2),a=r(6),o=(r(0),r(142)),c=r(144),b={slug:"welcome",title:"Fur \u4ecb\u7ecd",author:"dotnet\u4e2d\u56fd",author_title:"\u4e3a\u4e2d\u56fd .NET \u5f00\u53d1\u8005\u63d0\u4f9b\u4f18\u8d28\u7684\u8d44\u8baf\u548c\u6280\u672f\u5206\u4eab\u3002",author_url:"https://chinadot.net",author_image_url:"https://i.loli.net/2020/10/01/94AxjHp21aPKQWd.png",tags:["fur","furos",".net",".netcore",".net5"]},i={permalink:"/fur/blog/welcome",editUrl:"https://gitee.com/monksoul/Fur/tree/main/handbook/blog/2020-08-19-welcome.mdx",source:"@site/blog\\2020-08-19-welcome.mdx",description:"=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=a.a.createContext({}),p=function(e){var t=a.a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):b(b({},t),e)),r},l=function(e){var t=p(e.components);return a.a.createElement(u.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},m=a.a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),l=p(r),m=n,O=l["".concat(c,".").concat(m)]||l[m]||s[m]||o;return r?a.a.createElement(O,b(b({ref:t},u),{},{components:r})):a.a.createElement(O,b({ref:t},u))}));function O(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,c=new Array(o);c[0]=m;var b={};for(var i in t)hasOwnProperty.call(t,i)&&(b[i]=t[i]);b.originalType=e,b.mdxType="string"==typeof e?e:n,c[1]=b;for(var u=2;u=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var u=a.a.createContext({}),p=function(e){var t=a.a.useContext(u),r=t;return e&&(r="function"==typeof e?e(t):b(b({},t),e)),r},l=function(e){var t=p(e.components);return a.a.createElement(u.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},m=a.a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),l=p(r),m=n,O=l["".concat(c,".").concat(m)]||l[m]||s[m]||o;return r?a.a.createElement(O,b(b({ref:t},u),{},{components:r})):a.a.createElement(O,b({ref:t},u))}));function O(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,c=new Array(o);c[0]=m;var b={};for(var i in t)hasOwnProperty.call(t,i)&&(b[i]=t[i]);b.originalType=e,b.mdxType="string"==typeof e?e:n,c[1]=b;for(var u=2;u 29.1 常见问题 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/handbook/build/docs/appstartup/index.html b/handbook/build/docs/appstartup/index.html index 0b608014ba2..3f387e1f5c3 100644 --- a/handbook/build/docs/appstartup/index.html +++ b/handbook/build/docs/appstartup/index.html @@ -6,7 +6,7 @@ 3. 应用启动 | Fur - + @@ -48,7 +48,7 @@
namespace Fur.Web.Entry
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
}
}
}
Startup.cs 代码迁移

只需要将 ConfigureServicesConfigure 方法代码迁移到 FurWebCoreStartup.cs 中即可,而 Startup.cs 中两个方法留空即可。

非常简单吧。我们后续创建任何 MVCRazorPagesBlazor 项目只需要添加 Fur.Web.Core 引用和调用 Inject() 即可。

3.7 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/auth-control/index.html b/handbook/build/docs/auth-control/index.html index 33cec1868d3..2e6dbdf9e92 100644 --- a/handbook/build/docs/auth-control/index.html +++ b/handbook/build/docs/auth-control/index.html @@ -6,7 +6,7 @@ 14. 安全鉴权 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/handbook/build/docs/author/index.html b/handbook/build/docs/author/index.html index d9e237af7c5..8b04c6ef235 100644 --- a/handbook/build/docs/author/index.html +++ b/handbook/build/docs/author/index.html @@ -6,7 +6,7 @@ 1.2 关于作者 | Fur - + @@ -21,7 +21,7 @@

1.2 关于作者

互联网账号

  • 百小僧
  • Monk/MonkSoul

技术能力

自 2008 年 接触 IT 这个行业也有十余年了,在 后端(.NET/.NET Core/Java/PHP)、移动端(Xamarin/小程序/Java/Objective-C)、桌面端(WinForm/WPF/Electron)、前端(React/Vue/Angular/Node)等主流领域略知一二。

同时在技术培训领域也多有涉足。

职业情况

目前经营一家自己创办的软件科技公司,主要销售自主研发的 ERP 产品。

吃不起饭的时候也会接外包项目。

兴趣爱好

是个吃货,喜欢看抖音,看动漫,看美剧,看博客园、看开源中国。

对新技术颇感兴趣,喜欢开源事业,喜欢分享技术。

个人主页

https://gitee.com/monksoul

https://github.com/monksoul

- + diff --git a/handbook/build/docs/cache/index.html b/handbook/build/docs/cache/index.html index 20e684204b4..96fc0c55652 100644 --- a/handbook/build/docs/cache/index.html +++ b/handbook/build/docs/cache/index.html @@ -6,7 +6,7 @@ 13. 分布式缓存 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/handbook/build/docs/configuration/index.html b/handbook/build/docs/configuration/index.html index 1c56f1021cc..0cc199e000b 100644 --- a/handbook/build/docs/configuration/index.html +++ b/handbook/build/docs/configuration/index.html @@ -6,7 +6,7 @@ 4.1 配置 | Fur - + @@ -22,7 +22,7 @@

4.1 配置

温馨提示

推荐使用 《4.2 选项》代替本章节功能。(为什么)?

4.1.1 什么是配置

简单来说,配置将系统应用可动态调配的选项放在统一地方管理,通过不同的配置让系统做出动态调整。

ASP.NET Core 应用程序启动时默认加载 启动项目 下的 appsettings.json 作为应用配置。同时还支持不同的运行环境加载对应的配置文件,如:

  • Development:加载 appsettings.Development.json
  • Staging:加载 appsettings.Staging.json
  • {Environment}appsettings.{Environment}.json

4.1.2 配置的使用

假设我们需要在系统运行时获取系统名称、版本号及版权信息,这些信息可能随时变化而且需要在多个地方使用。这时就需要将这些信息配置起来。具体步骤如下:

4.1.2.1 配置 appsettings.json 信息

{
"AppInfo": {
"Name": "Fur",
"Version": "1.0.0",
"Company": "Baiqian"
}
}

4.1.2.2 读取 appsettings.json 信息

Fur 框架中,提供了两种读取方式:

  • 依赖注入 IConfiguration 对象读取
  • 通过 App.Configuration[jsonKey] 读取
using Microsoft.AspNetCore.Mvc;
namespace Fur.Web.Entry.Controllers
{
[Route("api/[controller]")]
public class DefaultController : ControllerBase
{
[HttpGet]
public string Get()
{
return $@"名称:{App.Configuration["AppInfo:Name"]},
版本:{App.Configuration["AppInfo:Version"]},
公司:{App.Configuration["AppInfo:Company"]}";
}
}
}
依赖注入的方式

通过依赖注入注入实例有几种方式:

  • 构造函数注入方式
private readonly IConfiguration _configuration;
public DefaultController(IConfiguration configuration)
{
_configuration = configuration;
}
  • 参数注入方式 [FromServices]
public string Get([FromServices] IConfiguration configuration)
{
}
  • 属性注入方式
public IConfiguration Configuration { get; set; }

想了解更多关于《ASP.NET Core - 依赖注入》 知识

4.1.2.3 如何选择读取方式

  • 在可依赖注入类中,依赖注入 IConfiguration 读取
  • 在静态类/非依赖注入类中,选择 App.Configuration[jsonKey] 读取

4.1.3 路径符 查找节点

ASP.NET Core 中,配置采用 : 分隔符来读取分层配置数据。如上述例子中的 AppInfo:Name。如有更多层级数据则只需要通过 : 进入下一层节点即可。

假设我们有以下配置信息:

{
"AppInfo": {
"Name": "Fur",
"Version": "1.0.0",
"Company": {
"Name": "Baiqian",
"Address": {
"City": "中国",
"Province": "广东省",
"Detail": "中山市东区紫马公园西门"
}
}
}
}
var companyName = App.Configuration["AppInfo:Name"]; // => Fur

4.1.4 自定义配置文件

大多情况下,我们的配置只需要在 appsettings.json 中配置即可,但一些特殊情况下,我们希望某些组件或功能拥有独立的配置,这个时候就需要用到自定义配置,Fur 目前支持 .json.xml 两种方式配置,如:

Fur.Web.Entry/emailsetting.json
{
"outlook": {
"smtp": {
"server": "smtp.office365.com",
"port": "587",
"ssl": "STARTTLS"
},
"pop": {
"server": "outlook.office365.com",
"port": "995",
"ssl": "TLS"
}
}
}
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<MyKey>MyXMLFile Value</MyKey>
<Position>
<Title>Title from MyXMLFile</Title>
<Name>Name from MyXMLFile</Name>
</Position>
<Logging>
<LogLevel>
<Default>Information</Default>
<Microsoft>Warning</Microsoft>
</LogLevel>
</Logging>
</configuration>
xml 配置事项

如果采用 xml 配置,那么文件名必须以 .config.xml 结尾(不区分大小写)。

同时 Fur 提供了非常灵活的方式支持自定义配置文件读取,如:

4.1.4.1 读取 emailsetting.json 配置

读取自定义配置文件和读取 appsettings.json 一致,系统会自动从多个配置文件中读取输入,如:

var smtpServer = App.Configuration["outlook:smtp:server"]; // => smtp.office365.com
特别说明

Fur 框架会在启动时自动扫描每一个项目层根目录下的 *.json*.xml 文件加入配置中。所以无需手工配置。

4.1.5 不同环境读取

在实际应用开发中,我们可能会根据不同的环境加载不同的配置文件,如 数据库连接字符串

这时我们只需要遵循特定命名规范 {name}.{Environment}.json 即可。如:

  • appsettings.Development.json
  • appsettings.Staging.json
  • appsettings.Production.json
  • emailsetting.Development.json
  • emailsetting.Staging.json
  • emailsetting.Production.json

这时,ASP.NET Core 会在应用启动时自动加载不同环境的配置文件。

4.1.6 配置更改通知(热更新

.NET Core 应用程序中,配置支持更改通知,也就是热更新操作。一旦监听到 appsetting.json 或自定义配置文件发生变动,就会触发 OnChange 方法。代码如下:

var appInfoConfiguration = App.Configuration["AppInfo"];
ChangeToken.OnChange(() => appInfoConfiguration.GetReloadToken(), () =>
{
var name = appInfoConfiguration["Name"]; // 实时的最新值
var version = appInfoConfiguration["Version"]; // 实时的最新值
});

4.1.7 配置的优缺点

  • 优点

    • 能够在系统运行时快速读取
    • 无需额外配置
  • 缺点

    • 存在重复读取
    • 通过硬编码字符串读取,容易出错
    • 不能设置默认值
    • 不能在运行环境中动态配置
    • 不能验证配置有效性
    • 不支持更改通知

4.1.8 配置使用场景

如果只需要一次性读取配置信息,则使用配置,否则应该使用 《4.2 选项》代替。

4.1.9 反馈与建议

与我们交流

给 Fur 提 Issue


了解更多

想了解更多 配置 知识可查阅 ASP.NET Core - 配置 章节。

- + diff --git a/handbook/build/docs/contribute/index.html b/handbook/build/docs/contribute/index.html index ee664ec20e6..f3431a5cb6d 100644 --- a/handbook/build/docs/contribute/index.html +++ b/handbook/build/docs/contribute/index.html @@ -6,7 +6,7 @@ 28. 贡献指南 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/handbook/build/docs/cors/index.html b/handbook/build/docs/cors/index.html index a5a598e242f..ef7505b9d9c 100644 --- a/handbook/build/docs/cors/index.html +++ b/handbook/build/docs/cors/index.html @@ -6,7 +6,7 @@ 15. CORS 跨域 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/handbook/build/docs/data-validation/index.html b/handbook/build/docs/data-validation/index.html index 320f97dbf57..3c83555f064 100644 --- a/handbook/build/docs/data-validation/index.html +++ b/handbook/build/docs/data-validation/index.html @@ -6,7 +6,7 @@ 8. 数据校验 | Fur - + @@ -69,7 +69,7 @@
namespace Fur.Application
{
public class FurAppService : IDynamicApiController
{
[TypeFilter(typeof(DataValidationFilter))]
public TestDto Post(TestDto testDto)
{
return testDto;
}
}
}

8.9.4 [ApiController] 控制器范围验证

[ApiController]Mvc 提供的控制器范围(含所有动作方法)的验证。

using Microsoft.AspNetCore.Mvc;
namespace Fur.Web.Entry.Controllers
{
[ApiController]
public class MvcController : Controller
{
public IActionResult Index()
{
return View();
}
}
}

8.10 MiniProfiler 查看

如下图所示:

8.10 多语言支持

文档整理中...

8.11 验证模型提供器

文档整理中...

8.12 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/dbcontext-Interceptor/index.html b/handbook/build/docs/dbcontext-Interceptor/index.html index 8212e822bfc..7a23d80d50f 100644 --- a/handbook/build/docs/dbcontext-Interceptor/index.html +++ b/handbook/build/docs/dbcontext-Interceptor/index.html @@ -6,7 +6,7 @@ 9.24 数据库操作拦截器 | Fur - + @@ -54,7 +54,7 @@
// 提交数据库失败
public override void SaveChangesFailed(DbContextErrorEventData eventData)
{
base.SaveChangesFailed(eventData);
}
// 提交数据库失败(异步)
public override Task SaveChangesFailedAsync(DbContextErrorEventData eventData, CancellationToken cancellationToken = default)
{
return base.SaveChangesFailedAsync(eventData, cancellationToken);
}
}
}

9.24.2.4 SavedChangesEvent 拦截

Fur 框架中为所有 AppDbContext 子类都提供了三个可重写的方法,这三个方法分别由三个事件触发:

  • 提交更改之前 SavingChanges 事件:触发 void SavingChangesEvent(object sender, SavingChangesEventArgs e) 方法
  • 提交更改之后 SavedChanges 事件:触发 void SavedChangesEvent(object sender, SavedChangesEventArgs e) 方法
  • 提交更改失败 SaveChangesFailed 事件:触发 void SaveChangesFailedEvent(object sender, SaveChangesFailedEventArgs e) 方法

通过这三个事件我们可以在数据库做增、删、改时候做拦截,比如设置创建时间、更新时间或其他默认操作

如自动添加租户Id:

protected override void SavingChangesEvent(object sender, SavingChangesEventArgs e)
{
// 获取当前事件对应上下文
var dbContext = sender as FurDbContext;
// 获取所有新增和更新的实体
var entities = dbContext.ChangeTracker.Entries()
.Where(u => u.State == EntityState.Added || u.State == EntityState.Modified);
foreach (var entity in entities)
{
switch (entity.State)
{
// 自动设置租户Id
case EntityState.Added:
entity.Property(nameof(Entity.TenantId)).CurrentValue = GetTenantId();
break;
// 排除租户Id
case EntityState.Modified:
entity.Property(nameof(Entity.TenantId)).IsModified = false;
break;
}
}
}

9.24.3 注册自定义过滤器

定义好过滤器之后,我们需要在数据库上下文中注册:

services.AddSqlitePool<FurDbContext>(interceptors: new IInterceptor[] {
new SqlConnectionProfilerInterceptor(),
new DbContextSaveChangesInterceptor(),
new SqlCommandProfilerInterceptor()
});

9.24.4 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/dbcontext-add-or-update/index.html b/handbook/build/docs/dbcontext-add-or-update/index.html index 5ea61843cba..f88e12ba7fd 100644 --- a/handbook/build/docs/dbcontext-add-or-update/index.html +++ b/handbook/build/docs/dbcontext-add-or-update/index.html @@ -6,7 +6,7 @@ 9.7 新增或更新操作 | Fur - + @@ -99,7 +99,7 @@
// 示例七
await user.InsertOrUpdateExcludeNowAsync(new[] { u=>u.Name, u=>u.Age});
// 示例八
await user.InsertOrUpdateExcludeNowAsync(new[] {"Age", "Name"});

9.5.7 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/dbcontext-add/index.html b/handbook/build/docs/dbcontext-add/index.html index ce7c563a53c..f102f2f7323 100644 --- a/handbook/build/docs/dbcontext-add/index.html +++ b/handbook/build/docs/dbcontext-add/index.html @@ -6,7 +6,7 @@ 9.5 新增操作 | Fur - + @@ -50,7 +50,7 @@
// 示例二
await repository.InsertNowAsync(new List<User> { user, user2 });
// 示例三
await repository.InsertNowAsync(new[] {user, user2 });
小知识

所有带 Now 结尾的表示立即提交到数据库,也就是立即调用 SaveChangesSaveChangesAsync

9.5.5 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/dbcontext-audit/index.html b/handbook/build/docs/dbcontext-audit/index.html index 8128053ee15..4c4aaf26460 100644 --- a/handbook/build/docs/dbcontext-audit/index.html +++ b/handbook/build/docs/dbcontext-audit/index.html @@ -6,7 +6,7 @@ 9.22 审计日志 | Fur - + @@ -34,7 +34,7 @@
object oldValue = null;
// 如果是新增数据,则 databaseValues 为空,所以需要判断一下
if (databaseValues != null)
{
oldValue = databaseValues[propName];
}
// 插入审计日志表
dbContext.Audits.Add(new Audit
{
Table = entityType.Name, // 表名
Column = propName, // 更新的列
NewValue = newValue, // 新值
OldValue = oldValue, // 旧值
CreatedTime = DateTime.Now, // 操作时间
UserId = userId, // 操作人
Operate = entity.State.ToString(); // 操作方式:新增、更新、删除
});
}
}
}
}
}
小知识

如果对性能有所要求,那么建议审计日志通过 日志组件 写入数据库,如,通过 Nlog、Log4Net 这些等:

// 插入审计日志表
dbContext.Audits.Add(new Audit
{
Table = entityType.Name, // 表名
Column = propName, // 更新的列
newValue = newValue, // 新值
OldValue = oldValue, // 旧值
CreatedTime = DateTime.Now, // 操作时间
UserId = userId, // 操作人
Operate = entity.State.ToString(); // 操作方式:新增、更新、删除
});

替换为:

logger.Information(JsonConvert.SerializeObject(new Audit
{
Table = entityType.Name, // 表名
Column = propName, // 更新的列
newValue = newValue, // 新值
OldValue = oldValue, // 旧值
CreatedTime = DateTime.Now, // 操作时间
UserId = userId, // 操作人
Operate = entity.State.ToString(); // 操作方式:新增、更新、删除
}));

通过上面的例子,我们就可以对数据库所有的新增、更新、删除进行监控了。

9.22.4 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/dbcontext-batch/index.html b/handbook/build/docs/dbcontext-batch/index.html index a79b44d05eb..f4f6bc434a2 100644 --- a/handbook/build/docs/dbcontext-batch/index.html +++ b/handbook/build/docs/dbcontext-batch/index.html @@ -6,7 +6,7 @@ 9.9 批量操作 | Fur - + @@ -29,7 +29,7 @@
// 根据条件批量更新
repository.Where(a => a.ItemId <= 500).BatchUpdate(a => new Item { Quantity = a.Quantity + 100 });
repository.Where(a => a.ItemId <= 500).BatchUpdate(new Item { Description = "Updated" });
await repository.Where(a => a.ItemId <= 500).BatchUpdateAsync(new Item { Description = "Updated" });
// 批量更新指定列
var updateColumns = new List<string> { nameof(Item.Quantity) };
var q = repository.Where(a => a.ItemId <= 500);
int affected = q.BatchUpdate(new Item { Description = "Updated" }, updateColumns);

9.9.3 批量操作性能

Operations\Rows100,000 EF100,000 EFBulk1,000,000 EFBulk
Insert38.98 s2.10 s17.99 s
Update109.25 s3.96 s31.45 s
Delete7.26 s2.04 s12.18 s
---------------------------------------------------------------
Together70.70 s5.88 s56.84 s

9.9.4 反馈与建议

与我们交流

给 Fur 提 Issue


了解更多

想了解更多 EFCore.BulkExtensions 知识可查阅 EFCore.BulkExtensions 开源仓库

- + diff --git a/handbook/build/docs/dbcontext-code-first/index.html b/handbook/build/docs/dbcontext-code-first/index.html index 32d19a69d40..02911936245 100644 --- a/handbook/build/docs/dbcontext-code-first/index.html +++ b/handbook/build/docs/dbcontext-code-first/index.html @@ -6,7 +6,7 @@ 9.20 模型生成数据库 | Fur - + @@ -25,7 +25,7 @@
/// <summary>
/// 年龄
/// </summary>
public int Age { get; set; }
/// <summary>
/// 住址
/// </summary>
public string Address { get; set; }
}
}
实体约定

所有数据库实体必须直接或间接继承 IEntity 接口。

9.20.2.2 打开 程序包管理控制台

9.20.2.3 切换默认项目

程序包管理控制台 默认项目设置为 Fur.Database.Migrations

9.20.2.4 创建模型版本

Add-Migration v1.0.0
特别说明

v1.0.0 是此处数据库更改的版本号,可以写任何字符串,但推荐写版本号,每次 +1

最终命令如下:

PM> Add-Migration v1.0.0
Build started...
Build succeeded.
Microsoft.EntityFrameworkCore.Model.Validation[10400]
Sensitive data logging is enabled. Log entries and exception messages may include sensitive application data, this mode should only be enabled during development.
Microsoft.EntityFrameworkCore.Infrastructure[10403]
Entity Framework Core 5.0.0-rc.1.20451.13 initialized 'FurDbContext' using provider 'Microsoft.EntityFrameworkCore.Sqlite' with options: SensitiveDataLoggingEnabled DetailedErrorsEnabled MaxPoolSize=100 MigrationsAssembly=Fur.Database.Migrations
To undo this action, use Remove-Migration.
PM>

生成成功后,Fur.Database.Migrations 项目下会新增 Migrations 文件夹(如果没有),同时本次的架构生成文件,如:

9.20.2.5 更新到数据库

Update-Database

执行该命令后,数据库就会自动根据模型生成对于的表。

小知识

如果 Update-Database 后面带字符串参数,则会自动还原数据库到指定版本,如:

Update-Database v0.0.3

将数据库还原到 v0.0.3 版本

9.20.3 更新模型

如果模型改变了,重复上面操作即可,如:

Add-Migration v1.0.1
Update-Database

9.20.4 导出 Sql

有些时候,我们没有直接更新数据库的权限,或者怕出问题,我们都会先生成 Sql 看看,这时候只需要通过 Script-Migration 导出即可,如:

Script-Migration

9.20.5 反馈与建议

与我们交流

给 Fur 提 Issue


了解更多

想了解更多 正向工厂 知识可查阅 EF Core - 管理数据库架构 章节。

- + diff --git a/handbook/build/docs/dbcontext-db-first/index.html b/handbook/build/docs/dbcontext-db-first/index.html index 07d9d2a896c..a381fc0e0f0 100644 --- a/handbook/build/docs/dbcontext-db-first/index.html +++ b/handbook/build/docs/dbcontext-db-first/index.html @@ -6,7 +6,7 @@ 9.19 数据库生成模型 | Fur - + @@ -58,7 +58,7 @@
}
}
Fur Tools v1.0.0 全部实体生成成功!
PM>

9.13.4 命令参数配置

Fur Tools Cli 支持多个参数配置,使用方法只需要在命令后面添加即可,如:

&"../tools/cli.ps1" -Context 数据库上下文名 -ConnectionName 连接字符串Key

支持参数如下:

  • -Tables:配置要生成的数据库表,数组类型,如果为空,则生成数据库所有表和视图。如:-Tables Person,PersonDetails
  • -Context:配置数据库上下文,默认 FurDbContext,如果有多个数据库上下文,则此参数必须配置
  • -ConnectionName:配置数据库连接字符串,对于 appsetting.json 中的 Key
  • -OutputDir:生成实体代码输出目录,默认为:./Fur.Core/Entities/
  • -DbProvider:数据库提供器,默认是 Microsoft.EntityFrameworkCore.SqlServer,其他数据库请指定对应程序集
    • SqlServerMicrosoft.EntityFrameworkCore.SqlServer
    • SqliteMicrosoft.EntityFrameworkCore.Sqlite
    • CosmosMicrosoft.EntityFrameworkCore.Cosmos
    • InMemoryDatabaseMicrosoft.EntityFrameworkCore.InMemory
    • MySqlPomelo.EntityFrameworkCore.MySql
    • PostgreSQLNpgsql.EntityFrameworkCore.PostgreSQL
    • OracleCitms.EntityFrameworkCore.Oracle
    • DmMicrosoft.EntityFrameworkCore.Dm
  • -EntryProject:Web 启用项目层名,默认 Fur.Web.Entry
  • -CoreProject:实体项目层名,默认 Fur.Core
  • -DbContextLocators:多数据库上下文定位器,默认 MasterDbContextLocator,支持多个,如:MasterDbContextLocator,MySqlDbContextLocator
  • -Product:解决方案默认前缀,如 Fur
  • -UseDatabaseNames:是否保持生成和数据库、表一致的名称

9.13.5 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/dbcontext-delete/index.html b/handbook/build/docs/dbcontext-delete/index.html index 674958231be..268d0f2aa65 100644 --- a/handbook/build/docs/dbcontext-delete/index.html +++ b/handbook/build/docs/dbcontext-delete/index.html @@ -6,7 +6,7 @@ 9.8 删除操作 | Fur - + @@ -66,7 +66,7 @@
// 示例五
await entity.FakeDeleteAsync();
// 示例六
await repository.UpdateIncludeAsync(user, u => u.IsDeleted);

9.8.9 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/dbcontext-filter/index.html b/handbook/build/docs/dbcontext-filter/index.html index 81944252b79..504daacef30 100644 --- a/handbook/build/docs/dbcontext-filter/index.html +++ b/handbook/build/docs/dbcontext-filter/index.html @@ -6,7 +6,7 @@ 9.23 实体/全局查询筛选器 | Fur - + @@ -33,7 +33,7 @@
// 创建表达式元素
var parameter = Expression.Parameter(metadata.ClrType, "u");
var properyName = Expression.Constant(nameof(Entity.IsDeleted));
var propertyValue = Expression.Constant(false);
// 构建表达式 u => EF.Property<bool>(u, "IsDeleted") == false
var expressionBody = Expression.Equal(Expression.Call(typeof(EF), nameof(EF.Property), new[] { typeof(bool) }, parameter, properyName), propertyValue);
var expression = Expression.Lambda(expressionBody, parameter);
return expression;
}
}
}
小建议

如果对动态构建 LambdaExpression 不熟悉的朋友,可以使用 System.Linq.Dynamic.Corehttps://github.com/zzzprojects/System.Linq.Dynamic.Core

9.23.3 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/dbcontext-function/index.html b/handbook/build/docs/dbcontext-function/index.html index fcf9a2a0843..7b2530bc0e1 100644 --- a/handbook/build/docs/dbcontext-function/index.html +++ b/handbook/build/docs/dbcontext-function/index.html @@ -6,7 +6,7 @@ 9.14 函数操作 | Fur - + @@ -45,7 +45,7 @@
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity(typeof(F_Person)).HasNoKey();
modelBuilder.HasDbFunction(() => GetPersons(default));
}
}
}

9.14.5.4 在 Linq 中使用

IQueryable<F_Person> query = _repository.DynamicDbContext.GetPersons(1);
var result = query.Where(u => u.Name.Equals("Fur")).ToList();

最终生成 Sql

SELECT [g].Id, [g].Name, [g].Age, [g].Address
FROM dbo.GetPersons(1) AS [g]
WHERE [g].Name == N'Fur';

9.14.6 在 EF Core 内置函数

EF Core 为我们提供了很多常用的内置函数,可以在 Lambda 条件中使用,主要是通过 EF.Functions 调用,如:

_repository.Where(u => EF.Functions.DateDiffHour(u.CreatedDt, DateTime.Now) > 8).FirstOrDefault();

这个语句使用了 EF.Functions.DateDiffHour 最终生成的 Sql 如下:

SELECT TOP(1) [a].*
FROM [dbo].[TEST] AS [a]
WHERE DATEDIFF(HOUR, [a].[CREATED_DT], GETDATE()) > 8

EF Core 内置函数就不一一列出了,可以通过 EF.Functions 查看更多,如果不能满足自己的需求,那么可以自定义 Linq 标量函数

9.14.7 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/dbcontext-hight-query/index.html b/handbook/build/docs/dbcontext-hight-query/index.html index 29dfaa47d5f..e54dc4e1c34 100644 --- a/handbook/build/docs/dbcontext-hight-query/index.html +++ b/handbook/build/docs/dbcontext-hight-query/index.html @@ -6,7 +6,7 @@ 9.11 高级查询操作 | Fur - + @@ -52,7 +52,7 @@
namespace Fur.Core
{
public class Person : Entity, IEntityTypeBuilder<Person>
{
public string Name { get; set; }
/// <summary>
/// 配置实体关系
/// </summary>
/// <param name="entityBuilder"></param>
/// <param name="dbContext"></param>
/// <param name="dbContextLocator"></param>
public void Configure(EntityTypeBuilder<City> entityBuilder, DbContext dbContext, Type dbContextLocator)
{
entityBuilder.ToSqlQuery(
@"select * from dbo.person.2020-09-19
union all
select * from dbo.person.2020-09-20");
}
}
}
var posts = repository.Where(u => u.Id > 10).ToList();

9.11.12 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/dbcontext-locator/index.html b/handbook/build/docs/dbcontext-locator/index.html index 181d7580e75..3b829f84b00 100644 --- a/handbook/build/docs/dbcontext-locator/index.html +++ b/handbook/build/docs/dbcontext-locator/index.html @@ -6,7 +6,7 @@ 9.2 数据库上下文定位器 | Fur - + @@ -23,7 +23,7 @@
namespace Fur.Core
{
public sealed class FurDbContextLocator : IDbContextLocator
{
}
}

9.2.4 默认数据库上下文定位器

Fur 框架中已经提供了 MasterDbContextLocator 默认数据库上下文定位器,所以默认数据库上下文只需继承 AppDbContext<TDbContext> 即可。

AppDbContext<TDbContext> 定义代码如下:

using Fur.DependencyInjection;
using Microsoft.EntityFrameworkCore;
namespace Fur.DatabaseAccessor
{
/// <summary>
/// 默认应用数据库上下文
/// </summary>
/// <typeparam name="TDbContext">数据库上下文</typeparam>
[NonBeScan]
public abstract class AppDbContext<TDbContext> : AppDbContext<TDbContext, MasterDbContextLocator>
where TDbContext : DbContext
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="options"></param>
public AppDbContext(DbContextOptions<TDbContext> options) : base(options)
{
}
}
}

9.2.5 数据库上下文定位器支持对象

目前数据库上下文支持以下多个对象:

  • AppDbContext<TEntity, TDbContextLocator>:数据上下文
  • IRepository<TEntity, TDbContextLocator:实体仓储
  • ISqlRepository<TDbContextLocator>: Sql 操作仓储
  • Func<Type, DbContext>:依赖注入获取数据库上下文
  • Entity<Tkey, TDbContextLocator> :实体配置
  • EntityBase<Tkey, TDbContextLocator1, ... TDbContextLocator8>:实体配置
  • EntityNotKey<TDbContextLocator1, ... TDbContextLocator8>:无键实体配置
  • IEntitySeedData<TEntity, TDbContextLocator1, ... TDbContextLocator8>:种子数据配置
  • IEntityTypeBuilder<TEntity, TDbContextLocator1, ... TDbContextLocator8>:实体类型构建器
  • IModelBuilderFilter<TDbContextLocator1, ... TDbContextLocator8>:模型构建筛选器
  • [QueryableFunction(DbContextLocators=Type[])]:查询函数

9.2.6 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/dbcontext-multi-database/index.html b/handbook/build/docs/dbcontext-multi-database/index.html index e1aad77be10..8dc3041e4ba 100644 --- a/handbook/build/docs/dbcontext-multi-database/index.html +++ b/handbook/build/docs/dbcontext-multi-database/index.html @@ -6,7 +6,7 @@ 9.18 多数据库操作 | Fur - + @@ -38,7 +38,7 @@
// 支持一个数据库
public class Person: IEntity<MySqlDbContextLocator>
{
// ....
}
// 支持多个数据库
public class Person: IEntity<MySqlDbContextLocator, SqliteDbContextLocator>
{
// ....
}
小知识

所有的 实体依赖接口或抽象类 都支持泛型方式 指定 数据库上下文定位器,最多支持 8 个。

9.18.3.5 Linq 函数方式

public static class QueryFunctions
{
[QueryableFunction("FN_GetId", "dbo", typeof(MySqlDbContextLocator), typeof(SqliteDbContextLocator))]
public static int GetId(int id) => throw new NotSupportedException();
}

9.18.4 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/dbcontext-proc/index.html b/handbook/build/docs/dbcontext-proc/index.html index 5b6aebcfb15..be5bb71f62f 100644 --- a/handbook/build/docs/dbcontext-proc/index.html +++ b/handbook/build/docs/dbcontext-proc/index.html @@ -6,7 +6,7 @@ 9.13 存储过程操作 | Fur - + @@ -114,7 +114,7 @@
// 获取 RETURN 返回值
var reval = result.ReturnValue;
// 获取返回结果集
var (list1,list2) = result.Result;
关于异步

Fur 框架每一个数据库操作都支持异步方式,由于篇幅有限,就不列举异步方式了。

9.13.3 关于 [DbParameter]

[DbParameter] 特性是用来标注 Sql函数存储过程 参数的,可配置属性:

  • Direction:设置参数方向,ParameterDirection 枚举类型,默认 ParameterDirection.Input
  • DbType:设置参数类型,DbType 枚举类型,无默认
  • Size:设置参数长度的,int 类型

其中 Direction 属性是默认构造函数参数。

9.13.4 关于 ProcedureOutputResult

ProcedureOutputResultProcedureOutputResult<TResult> 是复杂存储过程执行返回模型类,有以下属性:

  • OutputValues:多个输出值,ProcedureOutputValue 类型
  • ReturnValue:返回值,object 类型
  • Result:结果集,非泛型版本是 DataSet类型,否则是 泛型类型

9.13.5 存储过程参数

所有 sql 参数都支持四种方式:

  • DbParameter[]:数组类型
  • new {}:匿名类型
  • new Class{}:强类型类型(支持复杂存储过程参数)
  • Dictionary<string,object> 类型

9.13.6 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/dbcontext-query/index.html b/handbook/build/docs/dbcontext-query/index.html index c02ec0902bf..2e2a0f21a7d 100644 --- a/handbook/build/docs/dbcontext-query/index.html +++ b/handbook/build/docs/dbcontext-query/index.html @@ -6,7 +6,7 @@ 9.10 查询操作 | Fur - + @@ -133,7 +133,7 @@
// 示例二
_testRepository.Where(u => u.Name.EndWith("Fur"));
// 示例三
_testRepository.Where(u => u.Name.Contains("Fur"));

9.10.6.9 Case When

数据库中的 Case When 实际上对应的是我们程序中的 三元表达式 ,也就是使用 三元表达式 即可自动生成 Case When 语句。

9.10.7 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/dbcontext-read-write/index.html b/handbook/build/docs/dbcontext-read-write/index.html index 390b21a5e53..776d5de9c1d 100644 --- a/handbook/build/docs/dbcontext-read-write/index.html +++ b/handbook/build/docs/dbcontext-read-write/index.html @@ -6,7 +6,7 @@ 9.26 读写分离/主从复制 | Fur - + @@ -33,7 +33,7 @@
/// <summary>
/// 查询走从库
/// </summary>
/// <returns></returns>
public List<Person> Get()
{
return _msRepository.Slave1<Person>().AsEnumerable();
}
}
}

9.26.3 主从复制

主从复制:是一种数据备份的方案。

简单来说,是使用两个或两个以上相同的数据库,将一个数据库当做主数据库,而另一个数据库当做从数据库。在主数据库中进行相应操作时,从数据库记录下所有主数据库的操作,使其二者一模一样。

9.26.4 主从复制几种方式

9.26.4.1 同步复制

所谓的同步复制,意思是 Master 的变化,必须等待 Slave-1,Slave-2,...,Slave-n 完成后才能返回。 这样,显然不可取,比如,在 Web 前端页面上,用户增加了条记录,需要等待很长时间。

9.26.4.2 异步复制

如同 AJAX 请求一样。Master 只需要完成自己的数据库操作即可。至于 Slaves 是否收到二进制日志,是否完成操作,不用关心。(推荐方式)

9.26.4.3 半同步复制

Master 只保证 Slaves 中的一个操作成功,就返回,其他 Slave 不管。

下面将使用 SqlServer 简单配置主从复制功能。

9.26.5 SqlServer 主库配置

9.26.5.1 添加 本地发布

9.26.5.2 选择 分发服务器

9.26.5.3 启用 代理

9.26.5.4 发布数据库

9.26.5.5 快照发布

具体选择何种发布类型,视具体业务场景而定。

9.26.5.6 选择发布项目

9.26.5.7 配置分发计划

9.26.5.8 配置安全设置

9.26.5.9 完成配置

9.26.6 SqlServer 从库配置

9.26.6.1 添加 本地订阅

9.26.6.2 选择 分发服务器

9.26.6.3 选择 分发代理位置

9.26.6.4 选择 订阅数据库

9.26.6.5 选择 分发安全设置

9.26.6.6 选择 同步计划

9.26.6.7 完成订阅

9.26.7 分发定义监视

9.26.8 查看主从复制结果

特别特性

主从复制有一定迟延性,所以系统设计要有一定“容忍性"。

9.26.9 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/dbcontext-repository/index.html b/handbook/build/docs/dbcontext-repository/index.html index 7792b85f736..1d5083310c4 100644 --- a/handbook/build/docs/dbcontext-repository/index.html +++ b/handbook/build/docs/dbcontext-repository/index.html @@ -6,7 +6,7 @@ 9.4 仓储模式 | Fur - + @@ -28,7 +28,7 @@
// 其他更多数据库一样的操作

另外任何仓储或实体配置都支持多个数据库同时操作

仓储方式

IRepository<Person, MsSqlDbContextLocator> mssqlRepository
ISqlRepository<MsSqlDbContextLocator> mssqlRepository;

动态 sql 方式

"select * from person".Change<MsSqlDbContextLocator>().SqlQuery();

实体配置方式

public class User:Entity<MsSqlDbContextLocator, MySqlDbContextLocator>
{
}

Sql 代理方式

[SqlFunction("funcName", DbContextLocator = typeof(MySqlDbContextLocator))]
int GetAge(int id);

Linq 中方式

[QueryableFunction("funcName","dbo", DbContextLocator = typeof(MySqlDbContextLocator))]
string GetName()=> throw Oops.Oh("不支持该数据库操作");

9.4.5 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/dbcontext-seed-data/index.html b/handbook/build/docs/dbcontext-seed-data/index.html index a0633553466..356278936e8 100644 --- a/handbook/build/docs/dbcontext-seed-data/index.html +++ b/handbook/build/docs/dbcontext-seed-data/index.html @@ -6,7 +6,7 @@ 9.21 实体种子数据 | Fur - + @@ -27,7 +27,7 @@
namespace Fur.Application
{
public class PersonSeedData : IEntitySeedData<Person>
{
// 配置种子数据
public IEnumerable<Person> HasData(DbContext dbContext, Type dbContextLocator)
{
return new List<Person>
{
new Person { Id = 1, Name = "百小僧", Address = "广东省中山市" },
new Person { Id = 2, Name = "新生帝", Address = "广东省珠海市" }
};
}
}
}

9.21.3 导航属性

通常我们的实体有 一对多多对多等外键关系,那么我们需要单独为每一个实体添加数据种子,而不是直接写在主表中。

9.21.4 多个数据库种子数据

Fur 提供泛型的方式支持多个数据库种子数据设定,如:

using Fur.DatabaseAccessor;
using System.Collections.Generic;
namespace Fur.Application
{
public class PersonSeedData : IEntitySeedData<Person, MySqlDbContextLocator, SqliteDbContextLocator>
{
// 配置种子数据
public IEnumerable<Person> HasData(DbContext dbContext, Type dbContextLocator)
{
return new List<Person>
{
new Person { Id = 1, Name = "百小僧", Address = "广东省中山市" },
new Person { Id = 2, Name = "新生帝", Address = "广东省珠海市" }
};
}
}
}

上面的例子表示同时为 MySqlDbContextSqliteDbContext 创建种子数据。

9.21.5 反馈与建议

与我们交流

给 Fur 提 Issue


了解更多

想了解更多 数据种子 知识可查阅 EF Core - 数据种子设定 章节。

- + diff --git a/handbook/build/docs/dbcontext-sql-proxy/index.html b/handbook/build/docs/dbcontext-sql-proxy/index.html index d3883086103..caec297489a 100644 --- a/handbook/build/docs/dbcontext-sql-proxy/index.html +++ b/handbook/build/docs/dbcontext-sql-proxy/index.html @@ -6,7 +6,7 @@ 9.17 Sql 高级代理 | Fur - + @@ -71,7 +71,7 @@
namespace Fur.Application
{
public interface ISql : ISqlDispatchProxy
{
[SqlFunction("FN_Name")] // 标量函数
string GetValue(MyParam dto);
[SqlProcedure("FN_Name")] // 表值函数
List<Person> GetPersons(int id);
}
}
补充说明

Sql 代理会自动判断返回值然后自动执行特定函数类型。

9.17.6 为什么用它?

通过上面的例子大家就可以了解,这种方式操作 sql 非常简单,而且极易维护。大家不用去关系返回值,关心用哪个方法,所有东西会自动给你处理好。

所以,如果需要用 Sql 操作,推荐使用 Sql 高级代理。

9.17.7 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/dbcontext-sql-template/index.html b/handbook/build/docs/dbcontext-sql-template/index.html index 70233683fb7..b13734e2ae0 100644 --- a/handbook/build/docs/dbcontext-sql-template/index.html +++ b/handbook/build/docs/dbcontext-sql-template/index.html @@ -6,7 +6,7 @@ 9.16 Sql 模板 | Fur - + @@ -23,7 +23,7 @@
// 懒人方式
var users = "#(Select.User)".SqlQuery<User>(new { id = 1});
// Sql 代理方式
[SqlExecute("#(Select.User)")]
List<User> GetUser(int id);

9.16.3.2 高级嵌套

var users = repository.SqlQuery<User>(
@"select * from user u
left join #(User.Detail) d on u.Id = d.UserId
where id > @id");

9.16.4 Sql 模板配置

9.16.4.1 普通模式

{
"Select.User": "select * from User"
}

9.16.4.2 更多配置

{
"Select.User": {
"Sql": "select * from User where id > @id and Name = @name",
"Params": [
{
"Name": " Id",
"Value": "1",
"DbType": "Int16",
"Size": 10
},
{
"Name": " Name",
"Value": "百小僧",
"DbType": "String",
"Size": 10
}
]
}
}

9.16.5 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/dbcontext-sql/index.html b/handbook/build/docs/dbcontext-sql/index.html index 391dd42361b..54ae8d85db1 100644 --- a/handbook/build/docs/dbcontext-sql/index.html +++ b/handbook/build/docs/dbcontext-sql/index.html @@ -6,7 +6,7 @@ 9.15 Sql 操作 | Fur - + @@ -168,7 +168,7 @@
// 不再举例子。。。。。。
补充说明

不管是那种方式操作 Sql ,方法名参数都是一致的,如:

  • SqlQuery
  • SqlQueryAsync
  • SqlQueries
  • SqlQueriesAsync
  • SqlNonQuery
  • SqlNonQueryAsync
  • SqlScalar
  • SqlScalarAsync
  • SqlProcedureQuery
  • SqlProcedureQueryAsync
  • SqlProcedureQueries
  • SqlProcedureQueriesAsync
  • SqlProcedureScalar
  • SqlProcedureScalarAsync
  • SqlProcedureNonQuery
  • SqlProcedureNonQueryAsync
  • SqlProcedureOutput
  • SqlProcedureOutputAsync
  • SqlFunctionScalar
  • SqlFunctionScalarAsync
  • SqlFunctionQuery
  • SqlFunctionQuery

9.15.6 IRepository 操作

IRepository 也能操作 sql,调用方法也是和上面一致的,如:

var dataTable = repository.Sql().SqlQuery("select * from person");
特别说明

由于篇幅有限,不再列举所有例子。

9.15.7 IRepository<TEntity> 操作

IRepository<TEntity> 也能操作 sql,调用方法也是和上面一致的,如:

var dataTable = personRepository.SqlQuery("select * from person");
特别说明

由于篇幅有限,不再列举所有例子。

9.15.8 关于 Sql 参数

所有 sql存储过程函数 参数都支持四种方式:

  • DbParameter[]:数组类型
  • new {}:匿名类型
  • new Class{}:强类型类型(支持复杂存储过程参数)
  • Dictionary<string,object> 类型
小知识

建议除了复杂的存储过程(带 OUTPUT/RETURN)的以外,所有参数建议使用 new {} 匿名类型,如果需要动态参数,则可以使用 Dictionary<string,object> 类型。

9.15.9 多数据库 Sql 操作 💯 💛

Fur 框架拥有非常灵活的多数据库操作方式,只需通过多数据库上下文定位器即可动态切换数据库。

9.15.9.1 懒人无敌 🐮 方式

var dataTable = "select * from person".Change<MySqlDbContextLocator>().SqlQuery();
var persons = "select * from person whre id > @id".Change<SqliteDbContextLocator>().SqlQuery<Person>();
补充说明

懒人方式 只需要通过 Change<TDbContextLocator> 方式即可动态切换数据库。

9.15.9.2 ISqlRepository 方式

只需要通过 ISqlRepository<TDbContextLocator> 注入或通过 sqlRepository.Change<TDbContextLocator>() 切换。

9.15.9.3 IRepository 方式

只需要通过 repository.Change<TDbContextLocator>() 获取即可。

9.15.9.4 IRepository<TEntity> 方式

只需要通过 IRepository<TEntity, TDbContextLocator> 注入或通过 personRepository.Change<TEntity, TDbContextLocator>() 切换。

9.15.10 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/dbcontext-update/index.html b/handbook/build/docs/dbcontext-update/index.html index 543da87f18d..2ba229d578e 100644 --- a/handbook/build/docs/dbcontext-update/index.html +++ b/handbook/build/docs/dbcontext-update/index.html @@ -6,7 +6,7 @@ 9.6 更新操作 | Fur - + @@ -193,7 +193,7 @@
// 示例二
await repository.UpdateNowAsync(new List<User> { user, user2 });
// 示例三
await repository.UpdateNowAsync(new[] {user, user2 });
小知识

所有带 Now 结尾的表示立即提交到数据库,也就是立即调用 SaveChangesSaveChangesAsync

9.6.15 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/dbcontext-view/index.html b/handbook/build/docs/dbcontext-view/index.html index 4f31275ab3a..0a4e2ba6887 100644 --- a/handbook/build/docs/dbcontext-view/index.html +++ b/handbook/build/docs/dbcontext-view/index.html @@ -6,7 +6,7 @@ 9.12 视图操作 | Fur - + @@ -29,7 +29,7 @@
public FurService(IRepository<V_Person> repository)
{
// 初始化只读仓储
_readableRepository = repository.Constraint<IReadableRepository<V_Person>>();
}
/// <summary>
/// 读取视图
/// </summary>
/// <returns></returns>
public async Task<List<V_Person>> GetVPerson()
{
var list = await _readableRepository.AsAsyncEnumerable();
return list;
}
}
}
小知识

通过 .Constraint<TEntity,TDbContextLocator> 方法可以将仓储约束为特定仓储,如只读仓储,可读可写仓储,只新增仓储等。

9.12.5 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/dbcontext/index.html b/handbook/build/docs/dbcontext/index.html index c52ee620f63..2aaf9b98e38 100644 --- a/handbook/build/docs/dbcontext/index.html +++ b/handbook/build/docs/dbcontext/index.html @@ -6,7 +6,7 @@ 9.1 数据库上下文 | Fur - + @@ -32,7 +32,7 @@
options.AddDbPool<SecondDbContext, SecondDbContextDbContextLocator>(DbProvider.SqlServer); // 第二个数据库
options.AddDbPool<ThirdDbContext, ThirdDbContextDbContextLocator>(DbProvider.SqlServer); // 第三个数据库

9.1.8 动态数据库上下文对象

Fur 框架中,数据库上下文是定义在 Fur.EntityFramework.Core 项目层,并且该层不被 Fur.ApplicationFur.Core 等层引用。

所以就不能直接在 Fur.Application 项目层直接使用 Fur.EntityFramework.Core 定义的数据库上下文。

Fur 为了解决这个问题,提供了两种方式处理:

  • respository.DbContext :当前数据库上下文对象,返回是 DbContext 抽象类型
  • respository.DynamicDbContext:当前数据库上下文对象,返回的是 dynamic 类型

如果你只是想使用 DbContext 的功能,直接使用 respository.DbContext 即可,如:

respository.DbContext.SaveChanges();

如果你想能够获取具体的数据库上下文类型,如 MyDbContext,那么使用 respository.DynamicDbContext 就可以获取到具体的 MyDbContext 类型。如:

var persons = respository.DynamicDbContext.Persons.Find(1);
var users = respository.DynamicDbContext.Users;

这样就可以直接操作 MyDbContext 定义的属性和方法了。

9.1.9 反馈与建议

与我们交流

给 Fur 提 Issue


了解更多

想了解更多 数据库上下文 知识可查阅 EF Core - 配置 DbContext 章节。

- + diff --git a/handbook/build/docs/dependency-injection/index.html b/handbook/build/docs/dependency-injection/index.html index 3d16023d6fc..c24965a2b58 100644 --- a/handbook/build/docs/dependency-injection/index.html +++ b/handbook/build/docs/dependency-injection/index.html @@ -6,7 +6,7 @@ 11. 依赖注入/控制反转 | Fur - + @@ -54,7 +54,7 @@
Console.WriteLine("SayHello 方法返回值:" + result);
return result;
}
}
}

之后我们只需要为 TestService 增加 [Injection] 特性即可,如:

[Injection(Proxy = typeof(LogDispatchProxy))]
public class TestService: ITestService, ITransient
{
public string SayHello(string word)
{
return $"Hello {word}";
}
}

之后 SayHello 方法被调用的时候就可以实现动态拦截了,比如这里写日志。

11.12.1 AOP 的作用

这种面向切面的能力(动态拦截/代理)可以实现很多很多功能,如:

  • 动态日志记录
  • 动态修改参数
  • 动态修改返回值
  • 动态方法重定向
  • 动态修改代码逻辑
  • 动态实现异常监听

还可以做更多更多的事情。

11.13 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/deploy/index.html b/handbook/build/docs/deploy/index.html index 43aa9489ac2..da7b029984d 100644 --- a/handbook/build/docs/deploy/index.html +++ b/handbook/build/docs/deploy/index.html @@ -6,7 +6,7 @@ 25. 托管部署 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/handbook/build/docs/devops/index.html b/handbook/build/docs/devops/index.html index 087579b74ef..05a2a467182 100644 --- a/handbook/build/docs/devops/index.html +++ b/handbook/build/docs/devops/index.html @@ -6,7 +6,7 @@ 26. 持续部署集成 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/handbook/build/docs/dynamic-api-controller/index.html b/handbook/build/docs/dynamic-api-controller/index.html index 216e29ae163..3f9d9753f43 100644 --- a/handbook/build/docs/dynamic-api-controller/index.html +++ b/handbook/build/docs/dynamic-api-controller/index.html @@ -6,7 +6,7 @@ 5. 动态 WebAPI | Fur - + @@ -67,7 +67,7 @@
namespace Fur.Web.Entry.Controllers
{
public class MvcController : ControllerBase
{
public string Get()
{
return nameof(Fur);
}
}
}
注意事项

启用该配置后,如果 Mvc 控制器 没有任何 [Route] 特性,但是贴了 [ApiController] 特性将会报错。原因是 [ApiController] 特性内部做了路由特性检测。所以建议使用 [ApiDataValidation] 代替。

查看 ASP.NET Core - ApiBehaviorApplicationModelProvider 源码

5.11 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/entity/index.html b/handbook/build/docs/entity/index.html index 066c2d98fa7..4daa3b7f60b 100644 --- a/handbook/build/docs/entity/index.html +++ b/handbook/build/docs/entity/index.html @@ -6,7 +6,7 @@ 9.3 数据库实体 | Fur - + @@ -34,7 +34,7 @@
// 配置数据库实体
public void Configure(EntityTypeBuilder<User> entityBuilder, DbContext dbContext, Type dbContextLocator)
{
entityBuilder.HasKey(u => u.Id);
entityBuilder.HasIndex(u => u.Name);
}
}
}

9.3.3.2 在任何实例类中配置

using Fur.DatabaseAccessor;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
namespace Fur.Core
{
public class SomeClass : IEntityTypeBuilder<User>
{
public void Configure(EntityTypeBuilder<User> entityBuilder, DbContext dbContext, Type dbContextLocator)
{
entityBuilder.HasKey(u => u.Id);
entityBuilder.HasIndex(u => u.Name);
}
}
}

如,上面例子,通过 SomeClass 配置 User 数据库实体。

9.3.4 数据库实体配置说明

Fur 框架会自动扫描所有继承 IEntity 接口的类进行 DbSet<TEntity> 注册,也就是实现自动配置 DbContextOnModelCreating

如果需要跳过自动注册,只需要贴 [NonAutomatic][SkipScan] 特性即可。一旦贴了次特性,那么就需要手动配置 DbContextOnModelCreating

9.3.5 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/errors/index.html b/handbook/build/docs/errors/index.html index 42cfa4ff1e4..bb73a9fefef 100644 --- a/handbook/build/docs/errors/index.html +++ b/handbook/build/docs/errors/index.html @@ -6,7 +6,7 @@ 29.2 常见错误 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/handbook/build/docs/event-bus/index.html b/handbook/build/docs/event-bus/index.html index 49824ae94f9..22086fadc56 100644 --- a/handbook/build/docs/event-bus/index.html +++ b/handbook/build/docs/event-bus/index.html @@ -6,7 +6,7 @@ 18. 事件总线 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/handbook/build/docs/friendly-exception/index.html b/handbook/build/docs/friendly-exception/index.html index 037bbae6e5f..edf6f82e478 100644 --- a/handbook/build/docs/friendly-exception/index.html +++ b/handbook/build/docs/friendly-exception/index.html @@ -6,7 +6,7 @@ 7. 友好异常处理 | Fur - + @@ -54,7 +54,7 @@
return new JsonResult(new RESTfulResult
{
StatusCode = context.Result is EmptyResult ? StatusCodes.Status204NoContent : StatusCodes.Status200OK,
Successed = true,
Data = data,
Errors = null
});
}
/// <summary>
/// 验证失败返回值
/// </summary>
/// <param name="context"></param>
/// <param name="modelStates"></param>
/// <param name="validationResults"></param>
/// <param name="validateFaildMessage"></param>
/// <returns></returns>
public IActionResult OnValidateFailed(ActionExecutingContext context, ModelStateDictionary modelStates, Dictionary<string, IEnumerable<string>> validationResults, string validateFaildMessage)
{
return new JsonResult(new RESTfulResult
{
StatusCode = StatusCodes.Status400BadRequest,
Successed = false,
Data = null,
Errors = validationResults
});
}
}
}

之后在 Startup.cs 中注册即可:

services.AddControllers().AddUnifyResult<RESTfulResult, RESTfulResultProvider>();

7.14 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/get-start/index.html b/handbook/build/docs/get-start/index.html index 5d65f4aa329..06d866a5e63 100644 --- a/handbook/build/docs/get-start/index.html +++ b/handbook/build/docs/get-start/index.html @@ -6,7 +6,7 @@ 2. 一分钟入门 | Fur - + @@ -40,7 +40,7 @@
/// <summary>
/// 姓名
/// </summary>
[StringLength(32, MinimumLength = 2)]
public string Name { get; set; }
/// <summary>
/// 年龄
/// </summary>
public int Age { get; set; }
}
}

说好一分钟入门,你们用了多长时间。😁

- + diff --git a/handbook/build/docs/gooduse/index.html b/handbook/build/docs/gooduse/index.html index 9cdc1c9ab4f..1a12ead572b 100644 --- a/handbook/build/docs/gooduse/index.html +++ b/handbook/build/docs/gooduse/index.html @@ -6,7 +6,7 @@ 29.3 最佳实践 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/handbook/build/docs/grpc/index.html b/handbook/build/docs/grpc/index.html index 484505193c1..6a3c7fae27f 100644 --- a/handbook/build/docs/grpc/index.html +++ b/handbook/build/docs/grpc/index.html @@ -6,7 +6,7 @@ 24. Grpc 服务 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/handbook/build/docs/http/index.html b/handbook/build/docs/http/index.html index 9f047535544..f9e937a38d8 100644 --- a/handbook/build/docs/http/index.html +++ b/handbook/build/docs/http/index.html @@ -6,7 +6,7 @@ 20. 网络请求 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/handbook/build/docs/index.html b/handbook/build/docs/index.html index ab5dadd3faa..c49deb1187a 100644 --- a/handbook/build/docs/index.html +++ b/handbook/build/docs/index.html @@ -6,7 +6,7 @@ 1.1 介绍 | Fur - + @@ -15,13 +15,13 @@ - +
-

1.1 介绍

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

🌭 开源地址

🍿 Docker 镜像

  • Docker Hub 线上镜像
docker run --name fur -p 5000:80 monksoul/fur:v1.0.0-2020.10.14
  • 手动 打包镜像

打开 CMD/Shell/PowerShell 进入 Fur 项目根目录打包 Fur 镜像:

docker build -t fur:v1.0.0-2020.10.14 .

打包成功后,直接 docker run

docker run --name fur -p 5000:80 fur:v1.0.0-2020.10.14

🥞 架构设计

正在整理中...

🥝 功能模块

🥐 框架依赖

Fur 为了追求极速入门,极致性能,尽可能的不使用或减少第三方依赖。目前 Fur 仅集成了以下三个依赖:

麻雀虽小五脏俱全。Fur 即使只集成了这三个依赖,但是主流的 依赖注入/控制反转AOP 面向切面编程,事件总线数据验证数据库操作 等等一个都不少。

🥗 环境要求

  • Visual Studio 2019 Preview 16.8 +
  • .NET 5 SDK +
  • .Net Standard 2.1 +

🥪 支持平台

  • 运行环境
    • Windows
    • Linux
    • MacOS
    • Docker/K8S/K3S/Rancher
    • Xamarin/MAUI
  • 数据库
    • SqlServer
    • Sqlite
    • Azure Cosmos
    • MySql
    • PostgreSQL
    • InMemoryDatabase
    • Oracle
    • Firebird
    • 达梦数据库
  • 应用部署
    • Kestrel
    • Nginx
    • Jexus
    • IIS
    • Apache
    • PM2
    • Supervisor
    • 单文件
    • 容器(Docker/K8S/K3S/Rancher)

🍖 关于性能

Fur 目前采用 Visual Studio 2019 Preview 16.8 自带性能测试和 JMeter 进行测试,由于篇幅有限,只贴部分测试图,测试结果如下:


🍚 关于作者

一个拥有 12 年开发经验 .NETer。喜欢分享,喜欢新技术,在互联网多个技术领域皆有涉猎。

🍤 项目成员

🎈 欢迎更多的开发者加入 Fur 大家庭。

🍝 他们都在用

  • 百签科技(广东)有限公司
  • 码为科技(广州)有限公司
  • 广州启顺国际货运代理有限公司
  • 森丰供应链服务(广州)有限公司
  • 中山赢友网络科技有限公司
  • 中山模思软件科技有限公司
  • 珠海市恒泰新软件有限责任公司
  • 珠海思诺锐创软件有限公司
  • 深圳市易胜科技有限公司
  • 重庆虫儿飞科技有限公司
  • 重庆林木森科技有限公司
  • 深圳市品立方科技有限公司

如果您的项目使用到 Fur 开发,可以告诉我们。

🍻 贡献代码

Fur 遵循 Apache-2.0 开源协议,欢迎大家提交 PRIssue

如果要为项目做出贡献,请查看贡献指南。

🍍 捐赠列表

注:排序按捐赠顺序书写

捐赠人昵称捐赠金额(元)附语
🤴 爱吃油麦菜100感谢您的开源项目!
👳‍♂️ 麦壳饼200感谢您的开源项目!
👨 Sun100感谢您的开源项目!
👶 d61761720感谢您的开源项目!
👦 Diqiguoji00816.66见贤思齐
👲 nodyang100感谢您的开源项目!
👳‍♀️ mictxd100吹过的牛都实现。
🧓 欧流全10希望将来超越 Spring
👨‍⚕️ lionkon10...看了框架感觉拿来学习是很不错的...
😤 好人!10...Nice 的小僧,我们的 dotnetchina 马上火起来了...
😮 木木 Woody10感谢您的开源项目!

非常感谢您们的支持,正是因为您们,中国开源才可以越走越远,Fur 越走越远。

🥔 QQ 交流群

🧆 友情链接

👉 Fur 👉 SqlSugar 👉 Layx 👉 t-io 👉 ThinkPHP 👉 Hutool 👉 BootstrapAdmin 👉 BootstrapBlazor

+

1.1 介绍

star fork GitHub stars GitHub forks GitHub license nuget

Fur.NET 5 平台下极易入门、极速开发的 Web 应用框架。

🍕 名字的由来

故事是这样子的:

起初,想开发一个极易入门、极易维护的框架,开发理念为:一切从简,只为了更懒

所以自然而然想到了:Lazier,也就是 更懒 的意思。但是 更懒更烂 读音相近且中文名没有特色,对此换名问题我苦恼了好几天。

刚好有一次我在博客园中帮一个博友解答问题,解决后博友赞扬我对 .NET Core 颇有了解,我就顺嘴回答了一句:“略懂皮毛”

就这时,脑瓜子灵机一动,干脆起名为:“皮毛”?英文单词 Fur [fɜː(r)]”,单词又短而且中文读音既俗气又顺口。😄😎

所以,Fur 就诞生了。

之后就有了 “小僧不才,略懂皮毛(Fur)。” 广告语 和 chinadot.net 域名。

🍔 关于 LOGO

Fur LOGO 设计由 F U R 三个单词组成:

我相信很多人看到 Fur 的 LOGO 时都会问:“为什么选择奶牛?”,因为 那些年吹过的牛逼都实现了 🐮

之所以选择 奶牛 是因为 具有脚踏实地,任劳任怨的做事风格,同时 奶牛 意味着丰富的营养价值,正如 Fur 所能带给你的。

🍟 文档地址

🌭 开源地址

🍿 Docker 镜像

  • Docker Hub 线上镜像
docker run --name fur -p 5000:80 monksoul/fur:v1.0.0-rc.final
  • 手动 打包镜像

打开 CMD/Shell/PowerShell 进入 Fur 项目根目录打包 Fur 镜像:

docker build -t fur:v1.0.0-rc.final .

打包成功后,直接 docker run

docker run --name fur -p 5000:80 fur:v1.0.0-rc.final

🥞 架构设计

正在整理中...

🥝 功能模块

🥐 框架依赖

Fur 为了追求极速入门,极致性能,尽可能的不使用或减少第三方依赖。目前 Fur 仅集成了以下三个依赖:

麻雀虽小五脏俱全。Fur 即使只集成了这三个依赖,但是主流的 依赖注入/控制反转AOP 面向切面编程,事件总线数据验证数据库操作 等等一个都不少。

🥗 环境要求

  • Visual Studio 2019 Preview 16.8 +
  • .NET 5 SDK +
  • .Net Standard 2.1 +

🥪 支持平台

  • 运行环境
    • Windows
    • Linux
    • MacOS
    • Docker/K8S/K3S/Rancher
    • Xamarin/MAUI
  • 数据库
    • SqlServer
    • Sqlite
    • Azure Cosmos
    • MySql
    • PostgreSQL
    • InMemoryDatabase
    • Oracle
    • Firebird
    • 达梦数据库
  • 应用部署
    • Kestrel
    • Nginx
    • Jexus
    • IIS
    • Apache
    • PM2
    • Supervisor
    • 单文件
    • 容器(Docker/K8S/K3S/Rancher)

🍖 关于性能

Fur 目前采用 Visual Studio 2019 Preview 16.8 自带性能测试和 JMeter 进行测试,由于篇幅有限,只贴部分测试图,测试结果如下:


🍚 关于作者

一个拥有 12 年开发经验 .NETer。喜欢分享,喜欢新技术,在互联网多个技术领域皆有涉猎。

🍤 项目成员

🎈 欢迎更多的开发者加入 Fur 大家庭。

🍝 他们都在用

  • 百签科技(广东)有限公司
  • 码为科技(广州)有限公司
  • 广州启顺国际货运代理有限公司
  • 森丰供应链服务(广州)有限公司
  • 中山赢友网络科技有限公司
  • 中山模思软件科技有限公司
  • 珠海市恒泰新软件有限责任公司
  • 珠海思诺锐创软件有限公司
  • 深圳市易胜科技有限公司
  • 重庆虫儿飞科技有限公司
  • 重庆林木森科技有限公司
  • 深圳市品立方科技有限公司

如果您的项目使用到 Fur 开发,可以告诉我们。

🍻 贡献代码

Fur 遵循 Apache-2.0 开源协议,欢迎大家提交 PRIssue

如果要为项目做出贡献,请查看贡献指南。

🍍 捐赠列表

注:排序按捐赠顺序书写

捐赠人昵称捐赠金额(元)附语
🤴 爱吃油麦菜100感谢您的开源项目!
👳‍♂️ 麦壳饼200感谢您的开源项目!
👨 Sun100感谢您的开源项目!
👶 d61761720感谢您的开源项目!
👦 Diqiguoji00816.66见贤思齐
👲 nodyang100感谢您的开源项目!
👳‍♀️ mictxd100吹过的牛都实现。
🧓 欧流全10希望将来超越 Spring
👨‍⚕️ lionkon10...看了框架感觉拿来学习是很不错的...
😤 好人!10...Nice 的小僧,我们的 dotnetchina 马上火起来了...
😮 木木 Woody10感谢您的开源项目!

非常感谢您们的支持,正是因为您们,中国开源才可以越走越远,Fur 越走越远。

🥔 QQ 交流群

🧆 友情链接

👉 Fur 👉 SqlSugar 👉 Layx 👉 t-io 👉 ThinkPHP 👉 Hutool 👉 BootstrapAdmin 👉 BootstrapBlazor

- + @@ -30,6 +30,6 @@ - + \ No newline at end of file diff --git a/handbook/build/docs/job/index.html b/handbook/build/docs/job/index.html index bb020492302..9acd1171d66 100644 --- a/handbook/build/docs/job/index.html +++ b/handbook/build/docs/job/index.html @@ -6,7 +6,7 @@ 22. 任务调度 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/handbook/build/docs/local-language/index.html b/handbook/build/docs/local-language/index.html index df4c9ed2589..2727562f301 100644 --- a/handbook/build/docs/local-language/index.html +++ b/handbook/build/docs/local-language/index.html @@ -6,7 +6,7 @@ 16. 多语言处理 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/handbook/build/docs/logging/index.html b/handbook/build/docs/logging/index.html index ba58e6d7b7f..b8e673f797e 100644 --- a/handbook/build/docs/logging/index.html +++ b/handbook/build/docs/logging/index.html @@ -6,7 +6,7 @@ 19. 日志记录 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/handbook/build/docs/object-mapper/index.html b/handbook/build/docs/object-mapper/index.html index 59f6593ca1f..57c6c70d617 100644 --- a/handbook/build/docs/object-mapper/index.html +++ b/handbook/build/docs/object-mapper/index.html @@ -6,7 +6,7 @@ 12. 对象数据映射 | Fur - + @@ -15,14 +15,15 @@ - +

12. 对象数据映射

12.1 对象映射

简单来说,就是将一个对象的数据根据特定规则批量映射到另一个对象中,减少手工操作和降低人为出错率。如将 DTO 对象映射到 Entity 实体中,反之亦然。

12.2 先看例子

在过去,我们需要将一个对象的值转换到另一个对象中,我们需要这样做,如:

var entity = repository.Find(1);
-
var dto = new Dto();
dto.Id = entity.Id;
dto.Name = entity.Name;
dto.Age = entity.Age;
dto.Address = entity.Address;
dto.FullName = entity.FirstName + entity.LastName;
dto.IdCard = entity.IdCard.Replace("1234", "****");

上面的例子似乎没有任何问题,但是如果很多地方需要这样的赋值操作、或者相同的赋值操作在多个地方使用,又或者一个类中含有非常多的属性或自定义赋值操作。

那么这样的操作效率极低,容易出错,且代码非常臃肿和冗余。

所以,实现自动映射赋值和支持特殊配置的需求就有了。

目前 C# 平台有两个优秀的对象映射工具:MapsterAutoMapper,在 Fur 框架中,默认集成的是 MapsterMapster 是一款极易使用且超高性能的对象映射框架。

+
var dto = new Dto();
dto.Id = entity.Id;
dto.Name = entity.Name;
dto.Age = entity.Age;
dto.Address = entity.Address;
dto.FullName = entity.FirstName + entity.LastName;
dto.IdCard = entity.IdCard.Replace("1234", "****");

上面的例子似乎没有任何问题,但是如果很多地方需要这样的赋值操作、或者相同的赋值操作在多个地方使用,又或者一个类中含有非常多的属性或自定义赋值操作。那么这样的操作效率极低,容易出错,且代码非常臃肿和冗余。

所以,实现自动映射赋值和支持特殊配置的需求就有了。目前 C# 平台有两个优秀的对象映射工具:MapsterAutoMapperFur 框架中,默认集成的是 MapsterMapster 是一款极易使用且超高性能的对象映射框架。

12.3 Mapster 使用

现在,我们可以通过 Mapster 提供的对象映射方法:Adapt 方法改造上面的例子:

12.3.1 极易入门

var entity = repository.Find(1);
var dto = entity.Adapt<Dto>();

仅仅一行代码就可以实现 entity -> dto 的转换,如果涉及到赋值的复制操作,如 dto.FullNamedto.IdCard,我们只需要自定义映射规则类即可。

12.3.2 自定义映射规则

using Fur.ObjectMapper;
using Mapster;
using System;
+
namespace Fur.Application
{
public class Mapper : IObjectMapper
{
public void Register(TypeAdapterConfig config)
{
config.ForType<Entity, Dto>()
.Map(dest => dest.FullName, src => src.FirstName + src.LastName)
.Map(dest => dest.IdCard, src => src.IdCard.Replace("1234", "****"));
}
}
}
小知识

该映射文件 Mapper.cs 可以放在任何项目或文件夹中,Fur 会在程序启动的时候自动扫描并注入配置。

12.3.3 依赖注入方式

Mapster 除了提供 Adapt 拓展方法以外,同时还提供依赖注入的方式。

public class Person(IMapper mapper)
{
var dto = _mapper.Map<Dto>(entity);
}

12.3.4 和 EFCore 配合

Mapster 还提供了 ProjectToType Linq 拓展方法减少我们手动 Select 操作,如:

正常的操作:

var destinations = context.Sources
.Select(c => new Destination {
Id = p.Id,
Name = p.Name,
Surname = p.Surname,
....
})
.ToList();

使用 Mapster 之后:

var destinations = context.Sources.ProjectToType<Destination>().ToList();

12.4 反馈与建议

与我们交流

给 Fur 提 Issue


了解更多

想了解更多 Mapster 知识可查阅 Mapster - Wiki 文档。

- + @@ -31,6 +32,6 @@ - + \ No newline at end of file diff --git a/handbook/build/docs/options/index.html b/handbook/build/docs/options/index.html index 3f24f22d5b3..b8312c4771a 100644 --- a/handbook/build/docs/options/index.html +++ b/handbook/build/docs/options/index.html @@ -6,7 +6,7 @@ 4.2 选项 | Fur - + @@ -33,7 +33,7 @@
public void OnListener(AppInfoOptions options, IConfiguration configuration)
{
var name = options.Name; // 实时的最新值
var version = options.Version; // 实时的最新值
}
public void PostConfigure(AppInfoOptions options, IConfiguration configuration)
{
}
}
特别说明

IConfigurableOptionsListener<TOptions> 继承自 IConfigurableOptions<TOptions>

4.2.10 选项的优缺点

  • 优点

    • 强类型配置
    • 提供多种读取方式
    • 支持热加载
    • 支持设置默认值/后期配置
    • 支持在运行环境中动态配置
    • 支持验证配置有效性
    • 支持更改通知
    • 支持命名选项
  • 缺点

    • 需要定义对应类型
    • 需要在启动时注册

4.2.11 反馈与建议

与我们交流

给 Fur 提 Issue


了解更多

想了解更多 选项 知识可查阅 ASP.NET Core - 选项 章节。

- + diff --git a/handbook/build/docs/performance/index.html b/handbook/build/docs/performance/index.html index 680eb72817a..0b61d083983 100644 --- a/handbook/build/docs/performance/index.html +++ b/handbook/build/docs/performance/index.html @@ -6,7 +6,7 @@ 27.2 性能测试 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/handbook/build/docs/process-service/index.html b/handbook/build/docs/process-service/index.html index a927569826e..654582000ee 100644 --- a/handbook/build/docs/process-service/index.html +++ b/handbook/build/docs/process-service/index.html @@ -6,7 +6,7 @@ 21. 进程服务 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/handbook/build/docs/reference/index.html b/handbook/build/docs/reference/index.html index 77000f6a8d8..e2f8c5ba8e6 100644 --- a/handbook/build/docs/reference/index.html +++ b/handbook/build/docs/reference/index.html @@ -6,7 +6,7 @@ 1.4 项目引用 | Fur - + @@ -15,19 +15,15 @@ - +
-

1.4 项目引用

1.4.1 关于项目引用

Fur 框架默认采用多层项目设计架构,每一个项目层的依赖分别是:

  • Fur:核心层,无项目依赖
  • Fur.Application:添加 Fur.Core 引用
  • Fur.Core:添加 Fur 引用
  • Fur.Database.Migrations:添加 Fur.EntityFramework.Core 引用
  • Fur.EntityFramework.Core:添加 Fur.Core 引用
  • Fur.Web.Core:添加 Fur.ApplicationFur.Database.Migrations 引用
  • Fur.Web.Entry:添加 Fur.Web.Core 引用 和 Microsoft.EntityFrameworkCore.Tools

1.4.2 创建项目注意事项

Fur 框架采用最新的 .NET 5 共享包设计方式,所以,所有新建的 项目 都需要修改 .csproj 文件,并添加以下代码:

Fur.Core\Fur.Core.csproj
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>

完整代码如下:

<Project Sdk="Microsoft.NET.Sdk">
-
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<NoWarn>1701;1702;1591</NoWarn>
<DocumentationFile>Fur.Core.xml</DocumentationFile>
</PropertyGroup>
-
<ItemGroup>
<None Remove="Fur.Core.xml" />
</ItemGroup>
-
<ItemGroup>
<ProjectReference Include="..\Fur\Fur.csproj" />
</ItemGroup>
-
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
-
</Project>
-

所有新建项目都需添加 上述高亮代码,方可使用 Fur 全部功能。

1.4.3 反馈与建议

与我们交流

给 Fur 提 Issue

+

1.4 项目引用

1.4.1 关于项目引用

Fur 框架默认采用多层项目设计架构,每一个项目层的依赖分别是:

  • Fur:核心层,无项目依赖
  • Fur.Application:添加 Fur.Core 引用
  • Fur.Core:添加 Fur 引用
  • Fur.Database.Migrations:添加 Fur.EntityFramework.Core 引用
  • Fur.EntityFramework.Core:添加 Fur.Core 引用
  • Fur.Web.Core:添加 Fur.ApplicationFur.Database.Migrations 引用
  • Fur.Web.Entry:添加 Fur.Web.Core 引用 和 Microsoft.EntityFrameworkCore.Tools

如果开发者搭建自己的项目,则只需要在 Fur.Core 层引用 Nuget 中最新的 Fur 包即可。

1.4.2 集成 Fur 功能

项目搭建好之后,集成 Fur 框架只需要在 Program.cs 中 添加 Inject() 方法即可:

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
+
namespace Fur.Web.Entry
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
+
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.Inject()
.UseStartup<Startup>();
});
}
}
}

1.4.3 反馈与建议

与我们交流

给 Fur 提 Issue

- + @@ -36,6 +32,6 @@ - + \ No newline at end of file diff --git a/handbook/build/docs/saas/index.html b/handbook/build/docs/saas/index.html index d3a66397529..a2597e67f37 100644 --- a/handbook/build/docs/saas/index.html +++ b/handbook/build/docs/saas/index.html @@ -6,7 +6,7 @@ 10. SaaS 多租户 | Fur - + @@ -55,7 +55,7 @@
namespace Fur.EntityFramework.Core
{
[AppDbContext("Sqlite3ConnectionString")]
public class FurDbContext : AppDbContext<FurDbContext>, IMultiTenantOnSchema
{
public FurDbContext(DbContextOptions<FurDbContext> options) : base(options)
{
}
public string GetSchemaName()
{
return base.Tenant?.Schema;
}
}
}

10.7.6 关于 Code First 数据迁移

基于 Schema 方式比较特别,生成数据迁移的时候没办法获取租户信息,所以建议分开多次迁移,如:

public string GetSchemaName()
{
return base.Tenant?.Schema?? "租户一Schema";
}
public string GetSchemaName()
{
return base.Tenant?.Schema?? "租户二Schema";
}

这样就可以在迁移的时候生成多次迁移了。

10.8 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/signalr/index.html b/handbook/build/docs/signalr/index.html index 37b0e83628c..8379e186001 100644 --- a/handbook/build/docs/signalr/index.html +++ b/handbook/build/docs/signalr/index.html @@ -6,7 +6,7 @@ 23. 即时通讯 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/handbook/build/docs/source/index.html b/handbook/build/docs/source/index.html index ac159a7fd6f..03d874c164c 100644 --- a/handbook/build/docs/source/index.html +++ b/handbook/build/docs/source/index.html @@ -6,7 +6,7 @@ 1.3 源码结构 | Fur - + @@ -53,7 +53,7 @@
#prefer fields not to be prefaced with this. or Me. in Visual Basic
dotnet_style_qualification_for_field = false:suggestion
#prefer methods not to be prefaced with this. or Me. in Visual Basic
dotnet_style_qualification_for_method = false:suggestion
#prefer properties not to be prefaced with this. or Me. in Visual Basic
dotnet_style_qualification_for_property = false:suggestion
# Add file header
file_header_template = -----------------------------------------------------------------------------\nFur 是 .NET 5 平台下极易入门、极速开发的 Web 应用框架。\nCopyright © 2020 Fur, Baiqian Co.,Ltd.\n\n框架名称:Fur\n框架作者:百小僧\n框架版本:1.0.0\n源码地址:Gitee:https://gitee.com/monksoul/Fur \n Github:https://github.com/monksoul/Fur \n开源协议:Apache-2.0(http://www.apache.org/licenses/LICENSE-2.0)\n-----------------------------------------------------------------------------

1.2.4 Fur 核心层

Fur 核心层是 Fur 框架的中心,也是 Fur 能够支撑起来的必备层。

源码结构:

Fur
├─Fur.csproj
├─Fur.csproj.user
├─FurStartup.cs
├─ViewEngine
| ├─IViewEngine.cs
| ├─ViewEngine.cs
| ├─Templates
| | ├─IViewEngineCompiledTemplate.cs
| | ├─IViewEngineTemplate.cs
| | ├─ViewEngineCompiledTemplate.cs
| | └ViewEngineTemplate.cs
| ├─Options
| | └ViewEngineCompilationOptions.cs
| ├─Models
| | └AnonymousTypeWrapper.cs
| ├─Exceptions
| | ├─ViewEngineCompilationException.cs
| | └ViewEngineException.cs
| ├─Compilations
| | ├─IViewEngineCompilationOptionsBuilder.cs
| | └ViewEngineCompilationOptionsBuilder.cs
├─UnifyResult
| ├─Providers
| | ├─IUnifyResultProvider.cs
| | └RESTfulResultProvider.cs
| ├─Models
| | └RESTfulResult.cs
| ├─Filters
| | └SuccessUnifyResultFilter.cs
| ├─Extensions
| | └UnifyResultServiceCollectionExtensions.cs
├─SpecificationDocument
| ├─Options
| | └SpecificationDocumentSettingsOptions.cs
| ├─Models
| | ├─GroupOrder.cs
| | ├─SpecificationOpenApiInfo.cs
| | ├─SpecificationOpenApiSecurityRequirementItem.cs
| | └SpecificationOpenApiSecurityScheme.cs
| ├─Extensions
| | ├─SpecificationDocumentApplicationBuilderExtensions.cs
| | └SpecificationDocumentServiceCollectionExtensions.cs
| ├─Builders
| | └SpecificationDocumentBuilder.cs
| ├─Assets
| | └index-mini-profiler.html
├─ObjectMapper
| ├─Extensions
| | └ObjectMapperServiceCollectionExtensions.cs
| ├─Dependencies
| | └IObjectMapper.cs
├─LinqBuilder
| ├─Visitors
| | └ParameterReplaceExpressionVisitor.cs
| ├─Extensions
| | └LinqExtensions.cs
| ├─Builders
| | └LinqExpression.cs
├─FriendlyException
| ├─Oops.cs
| ├─Providers
| | └IErrorCodeTypeProvider.cs
| ├─Options
| | └ErrorCodeMessageSettingsOptions.cs
| ├─Models
| | └MethodIfException.cs
| ├─Filters
| | └FriendlyExceptionFilter.cs
| ├─Extensions
| | └FriendlyExceptionServiceCollectionExtensions.cs
| ├─Attributes
| | ├─ErrorCodeItemMetadataAttribute.cs
| | ├─ErrorCodeTypeAttribute.cs
| | └IfExceptionAttribute.cs
├─DynamicApiController
| ├─Penetrates.cs
| ├─Providers
| | └DynamicApiControllerFeatureProvider.cs
| ├─Options
| | └DynamicApiControllerSettingsOptions.cs
| ├─Models
| | └ParameterRouteTemplate.cs
| ├─Extensions
| | └DynamicApiControllerServiceCollectionExtensions.cs
| ├─Enums
| | └ApiSeats.cs
| ├─Dependencies
| | └IDynamicApiController.cs
| ├─Conventions
| | └DynamicApiControllerApplicationModelConvention.cs
| ├─Attributes
| | ├─ApiDescriptionSettingsAttribute.cs
| | ├─ApiSeatAttribute.cs
| | └DynamicApiControllerAttribute.cs
├─DependencyInjection
| ├─Options
| | └DependencyInjectionSettingsOptions.cs
| ├─Models
| | └ExternalService.cs
| ├─Extensions
| | └DependencyInjectionServiceCollectionExtensions.cs
| ├─Enums
| | ├─InjectionActions.cs
| | ├─InjectionPatterns.cs
| | └RegisterType.cs
| ├─Dependencies
| | ├─IPrivateDependency.cs
| | ├─IScoped.cs
| | ├─ISingleton.cs
| | ├─ITransient.cs
| | ├─Proxies
| | | └IDispatchProxy.cs
| ├─Attributes
| | ├─InjectionAttribute.cs
| | └SkipScanAttribute.cs
├─DataValidation
| ├─Validators
| | └DataValidator.cs
| ├─Providers
| | └IValidationMessageTypeProvider.cs
| ├─Options
| | └ValidationTypeMessageSettingsOptions.cs
| ├─Models
| | └DataValidationResult.cs
| ├─Filters
| | └DataValidationFilter.cs
| ├─Extensions
| | ├─DataValidationExtensions.cs
| | └DataValidationServiceCollectionExtensions.cs
| ├─Enums
| | ├─ValidationPattern.cs
| | └ValidationTypes.cs
| ├─Attributes
| | ├─DataValidationAttribute.cs
| | ├─NonValidationAttribute.cs
| | ├─ValidationItemMetadataAttribute.cs
| | ├─ValidationMessageAttribute.cs
| | ├─ValidationMessageTypeAttribute.cs
| | └ValidationTypeAttribute.cs
├─DataEncryption
| ├─AESEncryption.cs
| ├─DESCEncryption.cs
| └MD5Encryption.cs
├─DatabaseAccessor
| ├─UnitOfWork
| | ├─Filters
| | | └UnitOfWorkFilter.cs
| | ├─Attributes
| | | ├─NonTransactAttribute.cs
| | | └UnitOfWorkAttribute.cs
| ├─Repositories
| | ├─EFCoreRepository.cs
| | ├─IMSRepository.cs
| | ├─IRepository.cs
| | ├─ISqlRepository.cs
| | ├─MSRepository.cs
| | ├─SqlRepository.cs
| | ├─Implantations
| | | ├─DeletableRepository.cs
| | | ├─InsertableRepository.cs
| | | ├─OperableRepository.cs
| | | ├─ReadableRepository.cs
| | | ├─SqlExecutableRepository.cs
| | | ├─SqlReaderRepository.cs
| | | ├─UpdateableRepository.cs
| | | └WritableRepository.cs
| | ├─Dependencies
| | | ├─IDeletableRepository.cs
| | | ├─IInsertableRepository.cs
| | | ├─IOperableRepository.cs
| | | ├─IReadableRepository.cs
| | | ├─IRepositoryDependency.cs
| | | ├─ISqlExecutableRepository.cs
| | | ├─ISqlReaderRepository.cs
| | | ├─IUpdateableRepository.cs
| | | └IWritableRepository.cs
| ├─Pools
| | ├─DbContextPool.cs
| | └IDbContextPool.cs
| ├─MultiTenants
| | ├─Locators
| | | └MultiTenantDbContextLocator.cs
| | ├─Enums
| | | └MultiTenantOptions.cs
| | ├─Entities
| | | └Tenant.cs
| | ├─Dependencies
| | | ├─IMultiTenantOnDatabase.cs
| | | ├─IMultiTenantOnSchema.cs
| | | ├─IMultiTenantOnTable.cs
| | | └IPrivateMultiTenant.cs
| ├─Models
| | ├─DbProvider.cs
| | ├─PagedList.cs
| | ├─ProcedureOutputResult.cs
| | ├─ProcedureOutputValue.cs
| | ├─SqlTemplate.cs
| | └SqlTemplateParameter.cs
| ├─Locators
| | ├─IDbContextLocator.cs
| | └MasterDbContextLocator.cs
| ├─Interceptors
| | ├─DbContextSaveChangesInterceptor.cs
| | ├─SqlCommandProfilerInterceptor.cs
| | └SqlConnectionProfilerInterceptor.cs
| ├─Helpers
| | └DbHelpers.cs
| ├─Extensions
| | ├─DatabaseAccessorServiceCollectionExtensions.cs
| | ├─PagedQueryableExtensions.cs
| | ├─Repositories
| | | ├─IEntityExtensions.cs
| | | ├─IEntityWithDbContextLocatorExtensions.cs
| | | └SqlExtensions.cs
| | ├─DatabaseProvider
| | | ├─DatabaseProviderServiceCollectionExtensions.cs
| | | └Penetrates.cs
| | ├─DatabaseFacade
| | | ├─DbDataConvertExtensions.cs
| | | ├─DbObjectExtensions.cs
| | | └SqlAdoNetExtensions.cs
| ├─Enums
| | ├─DbFunctionType.cs
| | ├─EFCoreErrorCodes.cs
| | └ManualOptions.cs
| ├─Entities
| | ├─Dependencies
| | | ├─Entity.cs
| | | ├─EntityBase.cs
| | | ├─EntityNotKey.cs
| | | ├─IEntity.cs
| | | └IEntityNotKey.cs
| | ├─Configures
| | | ├─IEntitySeedData.cs
| | | ├─IEntityTypeBuilder.cs
| | | ├─IModelBuilderFilter.cs
| | | └IPrivateModelBuilder.cs
| | ├─Attributes
| | | ├─FakeDeleteAttribute.cs
| | | ├─NonAutomaticAttribute.cs
| | | └QueryableFunctionAttribute.cs
| ├─DynamicModels
| | ├─DynamicModelCacheKeyFactory.cs
| | └IEntityMutableTable.cs
| ├─Contexts
| | ├─AppDbContext.cs
| | ├─Builders
| | | ├─AppDbContextBuilder.cs
| | | ├─Models
| | | | └DbContextCorrelationType.cs
| | ├─Attributes
| | | └AppDbContextAttribute.cs
| ├─Attributes
| | └DbParameterAttribute.cs
| ├─Advances
| | ├─Proxies
| | | └SqlDispatchProxy.cs
| | ├─Models
| | | └SqlProxyMethod.cs
| | ├─Dependencies
| | | └ISqlDispatchProxy.cs
| | ├─Attributes
| | | ├─SqlExecuteAttribute.cs
| | | ├─SqlFunctionAttribute.cs
| | | ├─SqlProcedureAttribute.cs
| | | ├─Basics
| | | | ├─SqlObjectProxyAttribute.cs
| | | | ├─SqlProxyAttribute.cs
| | | | └SqlSentenceProxyAttribute.cs
├─CorsAccessor
| ├─Options
| | └CorsAccessorSettingsOptions.cs
| ├─Extensions
| | ├─CorsAccessorApplicationBuilderExtensions.cs
| | └CorsAccessorServiceCollectionExtensions.cs
├─ConfigurableOptions
| ├─Options
| | └IConfigurableOptions.cs
| ├─Extensions
| | └ConfigurableOptionsServiceCollectionExtensions.cs
| ├─Attributes
| | └OptionsSettingsAttribute.cs
├─Authorization
| ├─Penetrates.cs
| ├─Requirements
| | └AuthorizePolicyRequirement.cs
| ├─Providers
| | └AuthorizePolicyProvider.cs
| ├─Options
| | └JWTSettingsOptions.cs
| ├─Handlers
| | └AuthorizePolicyHandler.cs
| ├─Extensions
| | └PolicyAuthorizationServiceCollectionExtensions.cs
| ├─Attributes
| | └AuthorizePolicyAttribute.cs
├─App
| ├─App.cs
| ├─Startups
| | ├─AppStartup.cs
| | └HostingStartup.cs
| ├─Options
| | └AppSettingsOptions.cs
| ├─Filters
| | └StartupFilter.cs
| ├─Extensions
| | ├─AppApplicationBuilderExtensions.cs
| | ├─AppServiceCollectionExtensions.cs
| | ├─WebHostBuilderExtensions.cs
| | ├─Types
| | | └ObjectExtensions.cs
| ├─Attributes
| | └AppStartupAttribute.cs

1.2.5 Fur.Application 业务应用层

Fur.Application 业务应用层是最常用的层,几乎所有的业务代码都在这个层中编写。

源码结构:

Fur.Application
├─Fur.Application.Core.csproj
├─Fur.Application.Core.xml
└FurApplicationStartup.cs

1.2.6 Fur.Core 仓储实体层

Fur.Core 主要是存储自定义仓储和定义实体的层。

源码结构:

Fur.Core
├─Fur.Core.csproj
└FurCoreStartup.cs

1.2.7 Fur.Database.Migrations 数据库架构维护层

Fur.Database.Migrations 主要是用来存放 Database FirstCode First 生成的维护文件。

源码结构:

Fur.Database.Migrations
└Fur.Database.Migrations.csproj

1.2.8 Fur.EntityFramework.Core 数据库上下文配置层

Fur.EntityFramework.Core 主要是用来配置数据库上下文和其他数据库相关配置信息的。

源码结构:

Fur.EntityFramework.Core
└Fur.EntityFramework.Core.csproj

1.2.9 Fur.Web.Core 应用核心层

Fur.Web.Core 主要是用来配置 Web 入口一些代码,如 FilterMiddlewares 等。

源码结构:

Fur.Web.Core
├─Fur.Web.Core.xml
└FurWebCoreStartup.cs

1.2.10 Fur.Web.Entry 应用入口层

Fur.Web.Entry 是我们的应用层,也就是我们的 Web 项目层,发布层。

源码结构:

Fur.Web.Entry
├─appsettings.Development.json
├─appsettings.json
├─Fur.Web.Entry.csproj
├─Fur.Web.Entry.csproj.user
├─Fur.Web.Entry.xml
├─Program.cs
├─Startup.cs
├─wwwroot
| └README.md
├─Properties
| └launchSettings.json
├─Controllers
- + diff --git a/handbook/build/docs/specification-document/index.html b/handbook/build/docs/specification-document/index.html index f584569e4a8..533164a3fff 100644 --- a/handbook/build/docs/specification-document/index.html +++ b/handbook/build/docs/specification-document/index.html @@ -6,7 +6,7 @@ 6. 规范化接口文档 | Fur - + @@ -48,7 +48,7 @@
return new JsonResult(new RESTfulResult
{
StatusCode = context.Result is EmptyResult ? StatusCodes.Status204NoContent : StatusCodes.Status200OK,
Successed = true,
Data = data,
Errors = null
});
}
/// <summary>
/// 验证失败返回值
/// </summary>
/// <param name="context"></param>
/// <param name="modelStates"></param>
/// <param name="validationResults"></param>
/// <param name="validateFaildMessage"></param>
/// <returns></returns>
public IActionResult OnValidateFailed(ActionExecutingContext context, ModelStateDictionary modelStates, Dictionary<string, IEnumerable<string>> validationResults, string validateFaildMessage)
{
return new JsonResult(new RESTfulResult
{
StatusCode = StatusCodes.Status400BadRequest,
Successed = false,
Data = null,
Errors = validationResults
});
}
}
}

之后在 Startup.cs 中注册即可:

services.AddControllers().AddUnifyResult<RESTfulResult, RESTfulResultProvider>();

6.8 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/split-db/index.html b/handbook/build/docs/split-db/index.html index 508b26cd731..889ae766b13 100644 --- a/handbook/build/docs/split-db/index.html +++ b/handbook/build/docs/split-db/index.html @@ -6,7 +6,7 @@ 9.27 分表分库 | Fur - + @@ -25,7 +25,7 @@
// 通过数据库上下文定位器切换
repository.Change<Entity, MyDbContextLocator2>();

如需跨库查询,需用到数据库技术,如 SqlServer 链接服务器或同义词。

  • 动态切换数据库表
// 直接改变表,会有多线程操作bug,同时无法刷新模型
repository.ChangeTable("数据库表");
// 创建新的 DbContext,然后刷新 OnModelCreating(推荐方式)
var dynamicDbContextResolve = App.TransientServices.GetService<Func<Type, IScoped, DbContext>>();
var dynamicDbContext = dynamicDbContextResolve(typeof(MyDbContextLocator), default);
// 重新调用 OnModelCreating,在 OnModelCreating 中配置 ToTable("动态表") 即可。
DynamicModelCacheKeyFactory.RebuildModels();
var persons= dynamicDbContext.Set<Person>();
persons.Add(new Person{});
了解更多

想了解更多 DynamicModelCacheKeyFactory 知识可查阅 EF Core - 多个模型之间交替 章节。

9.27.7 反馈与建议

与我们交流

给 Fur 提 Issue

- + diff --git a/handbook/build/docs/tran/index.html b/handbook/build/docs/tran/index.html index bc8f7c75fd5..2dcc54cb8e0 100644 --- a/handbook/build/docs/tran/index.html +++ b/handbook/build/docs/tran/index.html @@ -6,7 +6,7 @@ 9.25 事务和工作单元 | Fur - + @@ -24,7 +24,7 @@
var blogs = _testRepository.Entity
.OrderBy(b => b.Url)
.ToList();
// 提交事务
transaction.Commit();
}
catch (Exception)
{
// 回滚事务
transaction.RollBack();
}
}

9.25.4 工作单元特性说明

9.25.4.1 [UnitOfWork]

[UnitOfWork] 特性用来标记事务信息,如作用范围,隔离级别等。

  • Enabled:是否启动工作单元,默认 true
  • ScopeOption:定义事务范围行为,默认 TransactionScopeOption.Required
  • IsolationLevel:设置事务隔离级别,默认 IsolationLevel.ReadCommitted;
  • AsyncFlowOption:允许跨线程连续任务的事务流,如有异步操作需开启该选项,默认开启
特别注意

一旦方法贴了 [UnitOfWork(false)] 特性后,那么该方法不再启用工作单元模式,也就是不包含事务,也不会自动提交数据库。慎用!

9.25.4.2 [NonTransact]

一但方法或类贴了 [NonTransact] 特性,那么将关闭事务操作,但是还是会自动保存数据库到数据。

9.25.5 常见错误

  • A TransactionScope must be disposed on the same thread that it was created.

只需要在当前操作方法上贴 [NonTransact] 特性即可。

9.25.6 反馈与建议

与我们交流

给 Fur 提 Issue


了解更多

想了解更多 事务 知识可查阅 EF Core - 使用事务 章节。

- + diff --git a/handbook/build/docs/unittest/index.html b/handbook/build/docs/unittest/index.html index 715765cbf4d..975522574b8 100644 --- a/handbook/build/docs/unittest/index.html +++ b/handbook/build/docs/unittest/index.html @@ -6,7 +6,7 @@ 27.1 单元测试 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/handbook/build/docs/view-engine/index.html b/handbook/build/docs/view-engine/index.html index e76d160843c..d0275abd63b 100644 --- a/handbook/build/docs/view-engine/index.html +++ b/handbook/build/docs/view-engine/index.html @@ -6,7 +6,7 @@ 17. 视图引擎 | Fur - + @@ -21,7 +21,7 @@
- + diff --git a/handbook/build/index.html b/handbook/build/index.html index b9933dc78e9..4e3d237d697 100644 --- a/handbook/build/index.html +++ b/handbook/build/index.html @@ -6,7 +6,7 @@ Fur 是 .NET 5 平台下极易入门、极速开发的 Web 应用框架。 Fur | Fur - + @@ -16,7 +16,7 @@

Fur 是 .NET 5 平台下极易入门、极速开发的 Web 应用框架。

[object Object]

.NET 5 新起点

.NET 5 是 .NET 的重要且令人兴奋的新方向。你会看到 .NET 变得更加简单,但也有更广泛的功能和实用程序。所有新的开发和功能都将是 .NET 5 的一部分,包括新的 C# 版本

[object Object]

“六级” 架构

Fur 在设计之初就秉承着 “六极” :极易入门、极速开发、极少依赖、极少配置、极其灵活、极易维护 的设计思想,在架构设计上做了大量的优化,支持各个能力阶层技术员极速上手。

[object Object]

冲一杯咖啡的时间

Fur 除了独具创新的设计理念和灵活的架构设计以外,同时还结合了主流的敏捷开发模式打造的一款极速开发框架。只需冲制一杯咖啡的时间便可完成工作

- + diff --git a/handbook/build/runtime~main.9427b071.js b/handbook/build/runtime~main.cff1907f.js similarity index 65% rename from handbook/build/runtime~main.9427b071.js rename to handbook/build/runtime~main.cff1907f.js index 3b6d8e5e69c..7fb0f56d3af 100644 --- a/handbook/build/runtime~main.9427b071.js +++ b/handbook/build/runtime~main.cff1907f.js @@ -1 +1 @@ -!function(e){function a(a){for(var f,r,t=a[0],n=a[1],o=a[2],u=0,l=[];u -[![star](https://gitee.com/monksoul/Fur/badge/star.svg?theme=gvp)](https://gitee.com/monksoul/Fur/stargazers) [![fork](https://gitee.com/monksoul/Fur/badge/fork.svg?theme=gvp)](https://gitee.com/monksoul/Fur/members) [![GitHub stars](https://img.shields.io/github/stars/MonkSoul/Fur?logo=github)](https://github.com/MonkSoul/Fur/stargazers) [![GitHub forks](https://img.shields.io/github/forks/MonkSoul/Fur?logo=github)](https://github.com/MonkSoul/Fur/network) [![GitHub license](https://img.shields.io/github/license/MonkSoul/Fur)](https://github.com/MonkSoul/Fur/blob/main/LICENSE) [![nuget](https://img.shields.io/badge/Nuget-1.0.0--rc2-brightgreen)](https://www.nuget.org/packages/Fur) +[![star](https://gitee.com/monksoul/Fur/badge/star.svg?theme=gvp)](https://gitee.com/monksoul/Fur/stargazers) [![fork](https://gitee.com/monksoul/Fur/badge/fork.svg?theme=gvp)](https://gitee.com/monksoul/Fur/members) [![GitHub stars](https://img.shields.io/github/stars/MonkSoul/Fur?logo=github)](https://github.com/MonkSoul/Fur/stargazers) [![GitHub forks](https://img.shields.io/github/forks/MonkSoul/Fur?logo=github)](https://github.com/MonkSoul/Fur/network) [![GitHub license](https://img.shields.io/github/license/MonkSoul/Fur)](https://github.com/MonkSoul/Fur/blob/main/LICENSE) [![nuget](https://img.shields.io/badge/Nuget-1.0.0--rc.final-blue)](https://www.nuget.org/packages/Fur) @@ -77,7 +77,7 @@ import useBaseUrl from "@docusaurus/useBaseUrl"; - `Docker Hub` 线上镜像 ```shell -docker run --name fur -p 5000:80 monksoul/fur:v1.0.0-2020.10.14 +docker run --name fur -p 5000:80 monksoul/fur:v1.0.0-rc.final ``` - `手动` 打包镜像 @@ -85,13 +85,13 @@ docker run --name fur -p 5000:80 monksoul/fur:v1.0.0-2020.10.14 打开 `CMD/Shell/PowerShell` 进入 `Fur` 项目根目录打包 `Fur` 镜像: ```shell -docker build -t fur:v1.0.0-2020.10.14 . +docker build -t fur:v1.0.0-rc.final . ``` 打包成功后,直接 `docker run`: ```shell -docker run --name fur -p 5000:80 fur:v1.0.0-2020.10.14 +docker run --name fur -p 5000:80 fur:v1.0.0-rc.final ``` ## 🥞 架构设计 diff --git a/handbook/docs/object-mapper.mdx b/handbook/docs/object-mapper.mdx index fb33c58937a..8fda4019cc7 100644 --- a/handbook/docs/object-mapper.mdx +++ b/handbook/docs/object-mapper.mdx @@ -24,10 +24,96 @@ dto.FullName = entity.FirstName + entity.LastName; dto.IdCard = entity.IdCard.Replace("1234", "****"); ``` -上面的例子似乎没有任何问题,但是如果很多地方需要这样的赋值操作、或者相同的赋值操作在多个地方使用,又或者一个类中含有非常多的属性或自定义赋值操作。 +上面的例子似乎没有任何问题,但是如果很多地方需要这样的赋值操作、或者相同的赋值操作在多个地方使用,又或者一个类中含有非常多的属性或自定义赋值操作。那么这样的操作效率极低,容易出错,且代码非常臃肿和冗余。 -那么这样的操作效率极低,容易出错,且代码非常臃肿和冗余。 +所以,实现自动映射赋值和支持特殊配置的需求就有了。目前 `C#` 平台有两个优秀的对象映射工具:`Mapster` 和 `AutoMapper`。**在 `Fur` 框架中,默认集成的是 [Mapster](https://github.com/MapsterMapper/Mapster),[Mapster](https://github.com/MapsterMapper/Mapster) 是一款极易使用且超高性能的对象映射框架。** -所以,实现自动映射赋值和支持特殊配置的需求就有了。 +## 12.3 `Mapster` 使用 -目前 `C#` 平台有两个优秀的对象映射工具:`Mapster` 和 `AutoMapper`,在 `Fur` 框架中,默认集成的是 `Mapster`,`Mapster` 是一款极易使用且超高性能的对象映射框架。 +现在,我们可以通过 `Mapster` 提供的对象映射方法:`Adapt` 方法改造上面的例子: + +### 12.3.1 极易入门 + +```cs +var entity = repository.Find(1); +var dto = entity.Adapt(); +``` + +仅仅一行代码就可以实现 `entity -> dto` 的转换,如果涉及到赋值的复制操作,如 `dto.FullName` 和 `dto.IdCard`,我们只需要自定义映射规则类即可。 + +### 12.3.2 自定义映射规则 + +```cs {1,7,11-13} +using Fur.ObjectMapper; +using Mapster; +using System; + +namespace Fur.Application +{ + public class Mapper : IObjectMapper + { + public void Register(TypeAdapterConfig config) + { + config.ForType() + .Map(dest => dest.FullName, src => src.FirstName + src.LastName) + .Map(dest => dest.IdCard, src => src.IdCard.Replace("1234", "****")); + } + } +} +``` + +:::tip 小知识 + +该映射文件 `Mapper.cs` 可以放在任何项目或文件夹中,`Fur` 会在程序启动的时候自动扫描并注入配置。 + +::: + +### 12.3.3 依赖注入方式 + +`Mapster` 除了提供 `Adapt` 拓展方法以外,同时还提供依赖注入的方式。 + +```cs +public class Person(IMapper mapper) +{ + var dto = _mapper.Map(entity); +} +``` + +### 12.3.4 和 `EFCore` 配合 + +`Mapster` 还提供了 `ProjectToType` Linq 拓展方法减少我们手动 `Select` 操作,如: + +正常的操作: + +```cs +var destinations = context.Sources + .Select(c => new Destination { + Id = p.Id, + Name = p.Name, + Surname = p.Surname, + .... + }) + .ToList(); +``` + +使用 `Mapster` 之后: + +```cs + var destinations = context.Sources.ProjectToType().ToList(); +``` + +## 12.4 反馈与建议 + +:::note 与我们交流 + +给 Fur 提 [Issue](https://gitee.com/monksoul/Fur/issues/new?issue)。 + +::: + +--- + +:::note 了解更多 + +想了解更多 `Mapster` 知识可查阅 [Mapster - Wiki](https://github.com/MapsterMapper/Mapster/wiki) 文档。 + +::: diff --git a/handbook/docs/reference.mdx b/handbook/docs/reference.mdx index 3eee8d9dec4..82f1808cac8 100644 --- a/handbook/docs/reference.mdx +++ b/handbook/docs/reference.mdx @@ -16,45 +16,38 @@ sidebar_label: 1.4 项目引用 - `Fur.Web.Core`:添加 `Fur.Application`,`Fur.Database.Migrations` 引用 - `Fur.Web.Entry`:添加 `Fur.Web.Core` 引用 和 `Microsoft.EntityFrameworkCore.Tools` 包 -## 1.4.2 创建项目注意事项 - -`Fur` 框架采用最新的 `.NET 5` 共享包设计方式,所以,所有新建的 `项目` 都需要修改 `.csproj` 文件,并添加以下代码: - -```xml title="Fur.Core\Fur.Core.csproj" - - - -``` - -完整代码如下: - -```xml {17-19} - - - - net5.0 - 1701;1702;1591 - Fur.Core.xml - - - - - - - - - - - - - - - - +如果开发者搭建自己的项目,则只需要在 `Fur.Core` 层引用 `Nuget` 中最新的 `Fur` 包即可。 + +## 1.4.2 集成 `Fur` 功能 + +项目搭建好之后,集成 `Fur` 框架只需要在 `Program.cs` 中 添加 `Inject()` 方法即可: + +```cs {18} +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; + +namespace Fur.Web.Entry +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) + { + return Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.Inject() + .UseStartup(); + }); + } + } +} ``` -所有新建项目都需添加 `上述高亮代码`,方可使用 `Fur` 全部功能。 - ## 1.4.3 反馈与建议 :::note 与我们交流