CINXE.COM
GitHub - dotnetcore/Util: Util是一个.Net平台下的应用框架,旨在提升中小团队的开发能力,由工具类、分层架构基类、Ui组件,配套代码生成模板,权限等组成。
<!DOCTYPE html> <html lang="en" data-color-mode="auto" data-light-theme="light" data-dark-theme="dark" data-a11y-animated-images="system" data-a11y-link-underlines="true" > <head> <meta charset="utf-8"> <link rel="dns-prefetch" href="https://github.githubassets.com"> <link rel="dns-prefetch" href="https://avatars.githubusercontent.com"> <link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com"> <link rel="dns-prefetch" href="https://user-images.githubusercontent.com/"> <link rel="preconnect" href="https://github.githubassets.com" crossorigin> <link rel="preconnect" href="https://avatars.githubusercontent.com"> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light-74231a1f3bbb.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark-8a995f0bacd4.css" /><link data-color-theme="dark_dimmed" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed-f37fb7684b1f.css" /><link data-color-theme="dark_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_high_contrast-9ac301c3ebe5.css" /><link data-color-theme="dark_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind-cd826e8636dc.css" /><link data-color-theme="light_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind-f91b0f603451.css" /><link data-color-theme="light_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_high_contrast-83beb16e0ecf.css" /><link data-color-theme="light_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia-6e122dab64fc.css" /><link data-color-theme="dark_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia-18119e682df0.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-primitives-225433424a87.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-cba26849680f.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-b6cb3703b934.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-ea73c9cb5377.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repository-4fce88777fa8.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-0210be90f4d3.css" /> <script type="application/json" id="client-env">{"locale":"en","featureFlags":["contentful_lp_flex_features_actions","contentful_lp_flex_features_codespaces","contentful_lp_flex_features_code_review","contentful_lp_flex_features_code_search","contentful_lp_flex_features_discussions","contentful_lp_flex_features_issues","copilot_immersive_issue_preview","copilot_new_references_ui","copilot_chat_repo_custom_instructions_preview","copilot_no_floating_button","copilot_topics_as_references","copilot_read_shared_conversation","copilot_duplicate_thread","dotcom_chat_client_side_skills","experimentation_azure_variant_endpoint","failbot_handle_non_errors","geojson_azure_maps","ghost_pilot_confidence_truncation_25","ghost_pilot_confidence_truncation_40","github_models_gateway_parse_params","github_models_o3_mini_streaming","insert_before_patch","issues_react_remove_placeholders","issues_react_blur_item_picker_on_close","issues_advanced_search_nested_ownership_filters","issues_dashboard_no_redirects","marketing_pages_search_explore_provider","primer_react_css_modules_ga","react_data_router_pull_requests","remove_child_patch","sample_network_conn_type","swp_enterprise_contact_form","site_copilot_pro_plus","site_proxima_australia_update","viewscreen_sandbox","issues_react_create_milestone","issues_react_cache_fix_workaround","lifecycle_label_name_updates","copilot_task_oriented_assistive_prompts","issue_types_prevent_private_type_creation","refresh_image_video_src","codespaces_prebuild_region_target_update","copilot_code_review_sign_up_closed"]}</script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/wp-runtime-213454f9c6ad.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover_js-9da652f58479.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_arianotify-polyfill_ariaNotify-polyfill_js-node_modules_github_mi-3abb8f-46b9f4874d95.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_failbot_failbot_ts-952d624642a1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/environment-f04cb2a9fc8c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_primer_behaviors_dist_esm_index_mjs-0dbb79f97f8f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_selector-observer_dist_index_esm_js-f690fd9ae3d5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_relative-time-element_dist_index_js-62d275b7ddd9.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_text-expander-element_dist_index_js-78748950cb0c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_auto-complete-element_dist_index_js-node_modules_github_catalyst_-8e9f78-a90ac05d2469.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_filter-input-element_dist_index_js-node_modules_github_remote-inp-b5f1d7-a1760ffda83d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_markdown-toolbar-element_dist_index_js-ceef33f593fa.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_file-attachment-element_dist_index_js-node_modules_primer_view-co-c44a69-efa32db3a345.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/github-elements-394f8eb34f19.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/element-registry-0b7798be0424.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_braintree_browser-detection_dist_browser-detection_js-node_modules_githu-2906d7-2a07a295af40.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_lit-html_lit-html_js-be8cb88f481b.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_morphdom_dist_morphdom-e-7c534c-a4a1922eb55f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_turbo_dist_turbo_es2017-esm_js-a03ee12d659a.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-893f9f-b6294cf703b7.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_color-convert_index_js-e3180fe3bcb3.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_quote-selection_dist_index_js-node_modules_github_session-resume_-947061-e7a6c4a19f98.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_updatable-content_updatable-content_ts-62f3e9c52ece.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_task-list_ts-app_assets_modules_github_sso_ts-ui_packages-900dde-768abe60b1f8.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_sticky-scroll-into-view_ts-3e000c5d31a9.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_ajax-error_ts-app_assets_modules_github_behaviors_include-d0d0a6-e7f74ee74d91.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_commenting_edit_ts-app_assets_modules_github_behaviors_ht-83c235-4bcbbbfbe1d4.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/behaviors-ba450e1a8c71.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_delegated-events_dist_index_js-node_modules_github_catalyst_lib_index_js-f6223d90c7ba.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/notifications-global-01e85cd1be94.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_virtualized-list_es_index_js-node_modules_github_template-parts_lib_index_js-94dc7a2157c1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-70450e-4b93df70b903.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_ref-selector_ts-52913063a0b9.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/codespaces-b419a25ee02f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_filter-input-element_dist_index_js-node_modules_github_remote-inp-3eebbd-0763620ad7bf.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_decorators_js-node_modules_delegated-events_di-e161aa-9d41fb1b6c9e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_file-attachment-element_dist_index_js-node_modules_github_remote--3c9c82-b71ef90fbdc7.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/repositories-10217e4e5a53.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_github_catalyst_lib_inde-dbbea9-26cce2010167.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/code-menu-d6d3c94ee97e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/primer-react-99bc880bd101.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-core-ea28978fa0f5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-lib-f1bca44e0926.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/octicons-react-cf2f2ab8dab4.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_emotion_is-prop-valid_dist_emotion-is-prop-valid_esm_js-node_modules_emo-434cb6-95f395b76298.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_stacktrace-parser_dist_s-e7dcdd-9a233856b02c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover-fn_js-55fea94174bf.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/notifications-subscriptions-menu-d0099b1c5f39.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.a490b7c9fa319e5cb069.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/notifications-subscriptions-menu.1bcff9205c241e99cff2.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.a490b7c9fa319e5cb069.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/notifications-subscriptions-menu.1bcff9205c241e99cff2.module.css" /> <title>GitHub - dotnetcore/Util: Util是一个.Net平台下的应用框架,旨在提升中小团队的开发能力,由工具类、分层架构基类、Ui组件,配套代码生成模板,权限等组成。</title> <meta name="route-pattern" content="/:user_id/:repository" data-turbo-transient> <meta name="route-controller" content="files" data-turbo-transient> <meta name="route-action" content="disambiguate" data-turbo-transient> <meta name="current-catalog-service-hash" content="f3abb0cc802f3d7b95fc8762b94bdcb13bf39634c40c357301c4aa1d67a256fb"> <meta name="request-id" content="C6E6:25704B:41B98:4BBB4:67F3F76E" data-pjax-transient="true"/><meta name="html-safe-nonce" content="88156ae52ae8f0432daf072198cd2c7e94ceb363c95cf9ce080d7c0d1f6dc9c1" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDNkU2OjI1NzA0Qjo0MUI5ODo0QkJCNDo2N0YzRjc2RSIsInZpc2l0b3JfaWQiOiI0NDI3MDcxMDk4Njc1NTI1NDg2IiwicmVnaW9uX2VkZ2UiOiJzb3V0aGVhc3Rhc2lhIiwicmVnaW9uX3JlbmRlciI6InNvdXRoZWFzdGFzaWEifQ==" data-pjax-transient="true"/><meta name="visitor-hmac" content="5999b8ea9203eb195fc6d23a10885264f85cbcd9fbcfc3d965beb86105da4b07" data-pjax-transient="true"/> <meta name="hovercard-subject-tag" content="repository:96299354" data-turbo-transient> <meta name="github-keyboard-shortcuts" content="repository,copilot" data-turbo-transient="true" /> <meta name="selected-link" value="repo_source" data-turbo-transient> <link rel="assets" href="https://github.githubassets.com/"> <meta name="google-site-verification" content="Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I"> <meta name="octolytics-url" content="https://collector.github.com/github/collect" /> <meta name="analytics-location" content="/<user-name>/<repo-name>" data-turbo-transient="true" /> <meta name="user-login" content=""> <meta name="viewport" content="width=device-width"> <meta name="description" content="Util是一个.Net平台下的应用框架,旨在提升中小团队的开发能力,由工具类、分层架构基类、Ui组件,配套代码生成模板,权限等组成。 - dotnetcore/Util"> <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub"> <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub"> <meta property="fb:app_id" content="1401488693436528"> <meta name="apple-itunes-app" content="app-id=1477376905, app-argument=https://github.com/dotnetcore/Util" /> <meta name="twitter:image" content="https://opengraph.githubassets.com/28d7fd987f81fdf9bd90532aef0771eddff95b2e584ada6c1cb9b5853d0447f6/dotnetcore/Util" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="GitHub - dotnetcore/Util: Util是一个.Net平台下的应用框架,旨在提升中小团队的开发能力,由工具类、分层架构基类、Ui组件,配套代码生成模板,权限等组成。" /><meta name="twitter:description" content="Util是一个.Net平台下的应用框架,旨在提升中小团队的开发能力,由工具类、分层架构基类、Ui组件,配套代码生成模板,权限等组成。 - dotnetcore/Util" /> <meta property="og:image" content="https://opengraph.githubassets.com/28d7fd987f81fdf9bd90532aef0771eddff95b2e584ada6c1cb9b5853d0447f6/dotnetcore/Util" /><meta property="og:image:alt" content="Util是一个.Net平台下的应用框架,旨在提升中小团队的开发能力,由工具类、分层架构基类、Ui组件,配套代码生成模板,权限等组成。 - dotnetcore/Util" /><meta property="og:image:width" content="1200" /><meta property="og:image:height" content="600" /><meta property="og:site_name" content="GitHub" /><meta property="og:type" content="object" /><meta property="og:title" content="GitHub - dotnetcore/Util: Util是一个.Net平台下的应用框架,旨在提升中小团队的开发能力,由工具类、分层架构基类、Ui组件,配套代码生成模板,权限等组成。" /><meta property="og:url" content="https://github.com/dotnetcore/Util" /><meta property="og:description" content="Util是一个.Net平台下的应用框架,旨在提升中小团队的开发能力,由工具类、分层架构基类、Ui组件,配套代码生成模板,权限等组成。 - dotnetcore/Util" /> <meta name="hostname" content="github.com"> <meta name="expected-hostname" content="github.com"> <meta http-equiv="x-pjax-version" content="f29992a53ec16f0125fb350a97b177f985497073ca845d54aeceb67a205468ca" data-turbo-track="reload"> <meta http-equiv="x-pjax-csp-version" content="e26f9f0ba624ee85cc7ac057d8faa8618a4f25a85eab052c33d018ac0f6b1a46" data-turbo-track="reload"> <meta http-equiv="x-pjax-css-version" content="205838381d6e5f35c535dbb12458f905bc43e0b186c86bf75aabbd0c0f36537c" data-turbo-track="reload"> <meta http-equiv="x-pjax-js-version" content="7528483355fd49ff5386cfafdbf35214ed41692741c6d1519f267ee1811f7df5" data-turbo-track="reload"> <meta name="turbo-cache-control" content="no-preview" data-turbo-transient=""> <meta data-hydrostats="publish"> <meta name="go-import" content="github.com/dotnetcore/Util git https://github.com/dotnetcore/Util.git"> <meta name="octolytics-dimension-user_id" content="19404084" /><meta name="octolytics-dimension-user_login" content="dotnetcore" /><meta name="octolytics-dimension-repository_id" content="96299354" /><meta name="octolytics-dimension-repository_nwo" content="dotnetcore/Util" /><meta name="octolytics-dimension-repository_public" content="true" /><meta name="octolytics-dimension-repository_is_fork" content="false" /><meta name="octolytics-dimension-repository_network_root_id" content="96299354" /><meta name="octolytics-dimension-repository_network_root_nwo" content="dotnetcore/Util" /> <link rel="canonical" href="https://github.com/dotnetcore/Util" data-turbo-transient> <meta name="turbo-body-classes" content="logged-out env-production page-responsive"> <meta name="browser-stats-url" content="https://api.github.com/_private/browser/stats"> <meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors"> <meta name="release" content="710b2f09bd828ca866e89071b4b74a8ef5dc5baa"> <link rel="mask-icon" href="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" color="#000000"> <link rel="alternate icon" class="js-site-favicon" type="image/png" href="https://github.githubassets.com/favicons/favicon.png"> <link rel="icon" class="js-site-favicon" type="image/svg+xml" href="https://github.githubassets.com/favicons/favicon.svg" data-base-href="https://github.githubassets.com/favicons/favicon"> <meta name="theme-color" content="#1e2327"> <meta name="color-scheme" content="light dark" /> <link rel="manifest" href="/manifest.json" crossOrigin="use-credentials"> </head> <body class="logged-out env-production page-responsive" style="word-wrap: break-word;"> <div data-turbo-body class="logged-out env-production page-responsive" style="word-wrap: break-word;"> <div class="position-relative header-wrapper js-header-wrapper "> <a href="#start-of-content" data-skip-target-assigned="false" class="px-2 py-4 color-bg-accent-emphasis color-fg-on-emphasis show-on-focus js-skip-to-content">Skip to content</a> <span data-view-component="true" class="progress-pjax-loader Progress position-fixed width-full"> <span style="width: 0%;" data-view-component="true" class="Progress-item progress-pjax-loader-bar left-0 top-0 color-bg-accent-emphasis"></span> </span> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_ui-commands_ui-commands_ts-2d52c8e72e64.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/keyboard-shortcuts-dialog-9cf818fcbb60.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.a490b7c9fa319e5cb069.module.css" /> <react-partial partial-name="keyboard-shortcuts-dialog" data-ssr="false" data-attempted-ssr="false" > <script type="application/json" data-target="react-partial.embeddedData">{"props":{"docsUrl":"https://docs.github.com/get-started/accessibility/keyboard-shortcuts"}}</script> <div data-target="react-partial.reactRoot"></div> </react-partial> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-94fd67-4898d1bf4b51.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/sessions-45d6658f8b6b.js"></script> <header class="HeaderMktg header-logged-out js-details-container js-header Details f4 py-3" role="banner" data-is-top="true" data-color-mode=light data-light-theme=light data-dark-theme=dark> <h2 class="sr-only">Navigation Menu</h2> <button type="button" class="HeaderMktg-backdrop d-lg-none border-0 position-fixed top-0 left-0 width-full height-full js-details-target" aria-label="Toggle navigation"> <span class="d-none">Toggle navigation</span> </button> <div class="d-flex flex-column flex-lg-row flex-items-center px-3 px-md-4 px-lg-5 height-full position-relative z-1"> <div class="d-flex flex-justify-between flex-items-center width-full width-lg-auto"> <div class="flex-1"> <button aria-label="Toggle navigation" aria-expanded="false" type="button" data-view-component="true" class="js-details-target js-nav-padding-recalculate js-header-menu-toggle Button--link Button--medium Button d-lg-none color-fg-inherit p-1"> <span class="Button-content"> <span class="Button-label"><div class="HeaderMenu-toggle-bar rounded my-1"></div> <div class="HeaderMenu-toggle-bar rounded my-1"></div> <div class="HeaderMenu-toggle-bar rounded my-1"></div></span> </span> </button> </div> <a class="mr-lg-3 color-fg-inherit flex-order-2 js-prevent-focus-on-mobile-nav" href="/" aria-label="Homepage" data-analytics-event="{"category":"Marketing nav","action":"click to go to homepage","label":"ref_page:Marketing;ref_cta:Logomark;ref_loc:Header"}"> <svg height="32" aria-hidden="true" viewBox="0 0 24 24" version="1.1" width="32" data-view-component="true" class="octicon octicon-mark-github"> <path d="M12 1C5.9225 1 1 5.9225 1 12C1 16.8675 4.14875 20.9787 8.52125 22.4362C9.07125 22.5325 9.2775 22.2025 9.2775 21.9137C9.2775 21.6525 9.26375 20.7862 9.26375 19.865C6.5 20.3737 5.785 19.1912 5.565 18.5725C5.44125 18.2562 4.905 17.28 4.4375 17.0187C4.0525 16.8125 3.5025 16.3037 4.42375 16.29C5.29 16.2762 5.90875 17.0875 6.115 17.4175C7.105 19.0812 8.68625 18.6137 9.31875 18.325C9.415 17.61 9.70375 17.1287 10.02 16.8537C7.5725 16.5787 5.015 15.63 5.015 11.4225C5.015 10.2262 5.44125 9.23625 6.1425 8.46625C6.0325 8.19125 5.6475 7.06375 6.2525 5.55125C6.2525 5.55125 7.17375 5.2625 9.2775 6.67875C10.1575 6.43125 11.0925 6.3075 12.0275 6.3075C12.9625 6.3075 13.8975 6.43125 14.7775 6.67875C16.8813 5.24875 17.8025 5.55125 17.8025 5.55125C18.4075 7.06375 18.0225 8.19125 17.9125 8.46625C18.6138 9.23625 19.04 10.2125 19.04 11.4225C19.04 15.6437 16.4688 16.5787 14.0213 16.8537C14.42 17.1975 14.7638 17.8575 14.7638 18.8887C14.7638 20.36 14.75 21.5425 14.75 21.9137C14.75 22.2025 14.9563 22.5462 15.5063 22.4362C19.8513 20.9787 23 16.8537 23 12C23 5.9225 18.0775 1 12 1Z"></path> </svg> </a> <div class="flex-1 flex-order-2 text-right"> <a href="/login?return_to=https%3A%2F%2Fgithub.com%2Fdotnetcore%2FUtil" class="HeaderMenu-link HeaderMenu-button d-inline-flex d-lg-none flex-order-1 f5 no-underline border color-border-default rounded-2 px-2 py-1 color-fg-inherit js-prevent-focus-on-mobile-nav" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://github.com/dotnetcore/Util","user_id":null}}" data-hydro-click-hmac="c4798be432629e8767cdd21415d2e7c37207359839cb0876cd7adc6133ace522" data-analytics-event="{"category":"Marketing nav","action":"click to Sign in","label":"ref_page:Marketing;ref_cta:Sign in;ref_loc:Header"}" > Sign in </a> </div> </div> <div class="HeaderMenu js-header-menu height-fit position-lg-relative d-lg-flex flex-column flex-auto top-0"> <div class="HeaderMenu-wrapper d-flex flex-column flex-self-start flex-lg-row flex-auto rounded rounded-lg-0"> <nav class="HeaderMenu-nav" aria-label="Global"> <ul class="d-lg-flex list-style-none"> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Product <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"github_copilot","context":"product","tag":"link","label":"github_copilot_link_product_navbar"}" href="https://github.com/features/copilot"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-copilot color-fg-subtle mr-3"> <path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path> </svg> <div> <div class="color-fg-default h4">GitHub Copilot</div> Write better code with AI </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"github_advanced_security","context":"product","tag":"link","label":"github_advanced_security_link_product_navbar"}" href="https://github.com/security/advanced-security"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-shield-check color-fg-subtle mr-3"> <path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path> </svg> <div> <div class="color-fg-default h4">GitHub Advanced Security</div> Find and fix vulnerabilities </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"actions","context":"product","tag":"link","label":"actions_link_product_navbar"}" href="https://github.com/features/actions"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-workflow color-fg-subtle mr-3"> <path d="M1 3a2 2 0 0 1 2-2h6.5a2 2 0 0 1 2 2v6.5a2 2 0 0 1-2 2H7v4.063C7 16.355 7.644 17 8.438 17H12.5v-2.5a2 2 0 0 1 2-2H21a2 2 0 0 1 2 2V21a2 2 0 0 1-2 2h-6.5a2 2 0 0 1-2-2v-2.5H8.437A2.939 2.939 0 0 1 5.5 15.562V11.5H3a2 2 0 0 1-2-2Zm2-.5a.5.5 0 0 0-.5.5v6.5a.5.5 0 0 0 .5.5h6.5a.5.5 0 0 0 .5-.5V3a.5.5 0 0 0-.5-.5ZM14.5 14a.5.5 0 0 0-.5.5V21a.5.5 0 0 0 .5.5H21a.5.5 0 0 0 .5-.5v-6.5a.5.5 0 0 0-.5-.5Z"></path> </svg> <div> <div class="color-fg-default h4">Actions</div> Automate any workflow </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"codespaces","context":"product","tag":"link","label":"codespaces_link_product_navbar"}" href="https://github.com/features/codespaces"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-codespaces color-fg-subtle mr-3"> <path d="M3.5 3.75C3.5 2.784 4.284 2 5.25 2h13.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 18.75 13H5.25a1.75 1.75 0 0 1-1.75-1.75Zm-2 12c0-.966.784-1.75 1.75-1.75h17.5c.966 0 1.75.784 1.75 1.75v4a1.75 1.75 0 0 1-1.75 1.75H3.25a1.75 1.75 0 0 1-1.75-1.75ZM5.25 3.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h13.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Zm-2 12a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h17.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25Z"></path><path d="M10 17.75a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path> </svg> <div> <div class="color-fg-default h4">Codespaces</div> Instant dev environments </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"issues","context":"product","tag":"link","label":"issues_link_product_navbar"}" href="https://github.com/features/issues"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-issue-opened color-fg-subtle mr-3"> <path d="M12 1c6.075 0 11 4.925 11 11s-4.925 11-11 11S1 18.075 1 12 5.925 1 12 1ZM2.5 12a9.5 9.5 0 0 0 9.5 9.5 9.5 9.5 0 0 0 9.5-9.5A9.5 9.5 0 0 0 12 2.5 9.5 9.5 0 0 0 2.5 12Zm9.5 2a2 2 0 1 1-.001-3.999A2 2 0 0 1 12 14Z"></path> </svg> <div> <div class="color-fg-default h4">Issues</div> Plan and track work </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"code_review","context":"product","tag":"link","label":"code_review_link_product_navbar"}" href="https://github.com/features/code-review"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-code-review color-fg-subtle mr-3"> <path d="M10.3 6.74a.75.75 0 0 1-.04 1.06l-2.908 2.7 2.908 2.7a.75.75 0 1 1-1.02 1.1l-3.5-3.25a.75.75 0 0 1 0-1.1l3.5-3.25a.75.75 0 0 1 1.06.04Zm3.44 1.06a.75.75 0 1 1 1.02-1.1l3.5 3.25a.75.75 0 0 1 0 1.1l-3.5 3.25a.75.75 0 1 1-1.02-1.1l2.908-2.7-2.908-2.7Z"></path><path d="M1.5 4.25c0-.966.784-1.75 1.75-1.75h17.5c.966 0 1.75.784 1.75 1.75v12.5a1.75 1.75 0 0 1-1.75 1.75h-9.69l-3.573 3.573A1.458 1.458 0 0 1 5 21.043V18.5H3.25a1.75 1.75 0 0 1-1.75-1.75ZM3.25 4a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h2.5a.75.75 0 0 1 .75.75v3.19l3.72-3.72a.749.749 0 0 1 .53-.22h10a.25.25 0 0 0 .25-.25V4.25a.25.25 0 0 0-.25-.25Z"></path> </svg> <div> <div class="color-fg-default h4">Code Review</div> Manage code changes </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"discussions","context":"product","tag":"link","label":"discussions_link_product_navbar"}" href="https://github.com/features/discussions"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-comment-discussion color-fg-subtle mr-3"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"></path><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"></path> </svg> <div> <div class="color-fg-default h4">Discussions</div> Collaborate outside of code </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"code_search","context":"product","tag":"link","label":"code_search_link_product_navbar"}" href="https://github.com/features/code-search"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-code-square color-fg-subtle mr-3"> <path d="M10.3 8.24a.75.75 0 0 1-.04 1.06L7.352 12l2.908 2.7a.75.75 0 1 1-1.02 1.1l-3.5-3.25a.75.75 0 0 1 0-1.1l3.5-3.25a.75.75 0 0 1 1.06.04Zm3.44 1.06a.75.75 0 1 1 1.02-1.1l3.5 3.25a.75.75 0 0 1 0 1.1l-3.5 3.25a.75.75 0 1 1-1.02-1.1l2.908-2.7-2.908-2.7Z"></path><path d="M2 3.75C2 2.784 2.784 2 3.75 2h16.5c.966 0 1.75.784 1.75 1.75v16.5A1.75 1.75 0 0 1 20.25 22H3.75A1.75 1.75 0 0 1 2 20.25Zm1.75-.25a.25.25 0 0 0-.25.25v16.5c0 .138.112.25.25.25h16.5a.25.25 0 0 0 .25-.25V3.75a.25.25 0 0 0-.25-.25Z"></path> </svg> <div> <div class="color-fg-default h4">Code Search</div> Find more, search less </div> </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="product-explore-heading">Explore</span> <ul class="list-style-none f5" aria-labelledby="product-explore-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"all_features","context":"product","tag":"link","label":"all_features_link_product_navbar"}" href="https://github.com/features"> All features </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"documentation","context":"product","tag":"link","label":"documentation_link_product_navbar"}" href="https://docs.github.com"> Documentation <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"github_skills","context":"product","tag":"link","label":"github_skills_link_product_navbar"}" href="https://skills.github.com"> GitHub Skills <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"blog","context":"product","tag":"link","label":"blog_link_product_navbar"}" href="https://github.blog"> Blog <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Solutions <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 pb-lg-3 mb-3 mb-lg-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-company-size-heading">By company size</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-company-size-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"enterprises","context":"solutions","tag":"link","label":"enterprises_link_solutions_navbar"}" href="https://github.com/enterprise"> Enterprises </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"small_and_medium_teams","context":"solutions","tag":"link","label":"small_and_medium_teams_link_solutions_navbar"}" href="https://github.com/team"> Small and medium teams </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"startups","context":"solutions","tag":"link","label":"startups_link_solutions_navbar"}" href="https://github.com/enterprise/startups"> Startups </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"nonprofits","context":"solutions","tag":"link","label":"nonprofits_link_solutions_navbar"}" href="/solutions/industry/nonprofits"> Nonprofits </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-use-case-heading">By use case</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-use-case-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"devsecops","context":"solutions","tag":"link","label":"devsecops_link_solutions_navbar"}" href="/solutions/use-case/devsecops"> DevSecOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"devops","context":"solutions","tag":"link","label":"devops_link_solutions_navbar"}" href="/solutions/use-case/devops"> DevOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"ci_cd","context":"solutions","tag":"link","label":"ci_cd_link_solutions_navbar"}" href="/solutions/use-case/ci-cd"> CI/CD </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"view_all_use_cases","context":"solutions","tag":"link","label":"view_all_use_cases_link_solutions_navbar"}" href="/solutions/use-case"> View all use cases </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-industry-heading">By industry</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-industry-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"healthcare","context":"solutions","tag":"link","label":"healthcare_link_solutions_navbar"}" href="/solutions/industry/healthcare"> Healthcare </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"financial_services","context":"solutions","tag":"link","label":"financial_services_link_solutions_navbar"}" href="/solutions/industry/financial-services"> Financial services </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"manufacturing","context":"solutions","tag":"link","label":"manufacturing_link_solutions_navbar"}" href="/solutions/industry/manufacturing"> Manufacturing </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"government","context":"solutions","tag":"link","label":"government_link_solutions_navbar"}" href="/solutions/industry/government"> Government </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"view_all_industries","context":"solutions","tag":"link","label":"view_all_industries_link_solutions_navbar"}" href="/solutions/industry"> View all industries </a></li> </ul> </div> </div> <div class="HeaderMenu-trailing-link rounded-bottom-2 flex-shrink-0 mt-lg-4 px-lg-4 py-4 py-lg-3 f5 text-semibold"> <a href="/solutions"> View all solutions <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-right HeaderMenu-trailing-link-icon"> <path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path> </svg> </a> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Resources <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="resources-topics-heading">Topics</span> <ul class="list-style-none f5" aria-labelledby="resources-topics-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"ai","context":"resources","tag":"link","label":"ai_link_resources_navbar"}" href="/resources/articles/ai"> AI </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"devops","context":"resources","tag":"link","label":"devops_link_resources_navbar"}" href="/resources/articles/devops"> DevOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"security","context":"resources","tag":"link","label":"security_link_resources_navbar"}" href="/resources/articles/security"> Security </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"software_development","context":"resources","tag":"link","label":"software_development_link_resources_navbar"}" href="/resources/articles/software-development"> Software Development </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"view_all","context":"resources","tag":"link","label":"view_all_link_resources_navbar"}" href="/resources/articles"> View all </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="resources-explore-heading">Explore</span> <ul class="list-style-none f5" aria-labelledby="resources-explore-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"learning_pathways","context":"resources","tag":"link","label":"learning_pathways_link_resources_navbar"}" href="https://resources.github.com/learn/pathways"> Learning Pathways <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"events_amp_webinars","context":"resources","tag":"link","label":"events_amp_webinars_link_resources_navbar"}" href="https://resources.github.com"> Events & Webinars <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"ebooks_amp_whitepapers","context":"resources","tag":"link","label":"ebooks_amp_whitepapers_link_resources_navbar"}" href="https://github.com/resources/whitepapers"> Ebooks & Whitepapers </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"customer_stories","context":"resources","tag":"link","label":"customer_stories_link_resources_navbar"}" href="https://github.com/customer-stories"> Customer Stories </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"partners","context":"resources","tag":"link","label":"partners_link_resources_navbar"}" href="https://partner.github.com"> Partners <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"executive_insights","context":"resources","tag":"link","label":"executive_insights_link_resources_navbar"}" href="https://github.com/solutions/executive-insights"> Executive Insights </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Open Source <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 px-lg-4"> <div class="HeaderMenu-column"> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"github_sponsors","context":"open_source","tag":"link","label":"github_sponsors_link_open_source_navbar"}" href="/sponsors"> <div> <div class="color-fg-default h4">GitHub Sponsors</div> Fund open source developers </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"the_readme_project","context":"open_source","tag":"link","label":"the_readme_project_link_open_source_navbar"}" href="https://github.com/readme"> <div> <div class="color-fg-default h4">The ReadME Project</div> GitHub community articles </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="open-source-repositories-heading">Repositories</span> <ul class="list-style-none f5" aria-labelledby="open-source-repositories-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"topics","context":"open_source","tag":"link","label":"topics_link_open_source_navbar"}" href="https://github.com/topics"> Topics </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"trending","context":"open_source","tag":"link","label":"trending_link_open_source_navbar"}" href="https://github.com/trending"> Trending </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"collections","context":"open_source","tag":"link","label":"collections_link_open_source_navbar"}" href="https://github.com/collections"> Collections </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Enterprise <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 px-lg-4"> <div class="HeaderMenu-column"> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"enterprise_platform","context":"enterprise","tag":"link","label":"enterprise_platform_link_enterprise_navbar"}" href="/enterprise"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-stack color-fg-subtle mr-3"> <path d="M11.063 1.456a1.749 1.749 0 0 1 1.874 0l8.383 5.316a1.751 1.751 0 0 1 0 2.956l-8.383 5.316a1.749 1.749 0 0 1-1.874 0L2.68 9.728a1.751 1.751 0 0 1 0-2.956Zm1.071 1.267a.25.25 0 0 0-.268 0L3.483 8.039a.25.25 0 0 0 0 .422l8.383 5.316a.25.25 0 0 0 .268 0l8.383-5.316a.25.25 0 0 0 0-.422Z"></path><path d="M1.867 12.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path><path d="M1.867 16.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path> </svg> <div> <div class="color-fg-default h4">Enterprise platform</div> AI-powered developer platform </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="enterprise-available-add-ons-heading">Available add-ons</span> <ul class="list-style-none f5" aria-labelledby="enterprise-available-add-ons-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"github_advanced_security","context":"enterprise","tag":"link","label":"github_advanced_security_link_enterprise_navbar"}" href="https://github.com/security/advanced-security"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-shield-check color-fg-subtle mr-3"> <path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path> </svg> <div> <div class="color-fg-default h4">GitHub Advanced Security</div> Enterprise-grade security features </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"copilot_for_business","context":"enterprise","tag":"link","label":"copilot_for_business_link_enterprise_navbar"}" href="/features/copilot/copilot-business"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-copilot color-fg-subtle mr-3"> <path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path> </svg> <div> <div class="color-fg-default h4">Copilot for business</div> Enterprise-grade AI features </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"premium_support","context":"enterprise","tag":"link","label":"premium_support_link_enterprise_navbar"}" href="/premium-support"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-comment-discussion color-fg-subtle mr-3"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"></path><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"></path> </svg> <div> <div class="color-fg-default h4">Premium Support</div> Enterprise-grade 24/7 support </div> </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <a class="HeaderMenu-link no-underline px-0 px-lg-2 py-3 py-lg-2 d-block d-lg-inline-block" data-analytics-event="{"location":"navbar","action":"pricing","context":"global","tag":"link","label":"pricing_link_global_navbar"}" href="https://github.com/pricing">Pricing</a> </li> </ul> </nav> <div class="d-flex flex-column flex-lg-row width-full flex-justify-end flex-lg-items-center text-center mt-3 mt-lg-0 text-lg-left ml-lg-3"> <qbsearch-input class="search-input" data-scope="repo:dotnetcore/Util" data-custom-scopes-path="/search/custom_scopes" data-delete-custom-scopes-csrf="GdHKqMGWATu73xsQj6RzTv8yzX8iLbLd_CW4PITvB5qswHen7NndjXwIlhIdiyrx-36CP16Jff5O8elHVdRuBw" data-max-custom-scopes="10" data-header-redesign-enabled="false" data-initial-value="" data-blackbird-suggestions-path="/search/suggestions" data-jump-to-suggestions-path="/_graphql/GetSuggestedNavigationDestinations" data-current-repository="dotnetcore/Util" data-current-org="dotnetcore" data-current-owner="" data-logged-in="false" data-copilot-chat-enabled="false" data-nl-search-enabled="false" data-retain-scroll-position="true"> <div class="search-input-container search-with-dialog position-relative d-flex flex-row flex-items-center mr-4 rounded" data-action="click:qbsearch-input#searchInputContainerClicked" > <button type="button" class="header-search-button placeholder input-button form-control d-flex flex-1 flex-self-stretch flex-items-center no-wrap width-full py-0 pl-2 pr-0 text-left border-0 box-shadow-none" data-target="qbsearch-input.inputButton" aria-label="Search or jump to…" aria-haspopup="dialog" placeholder="Search or jump to..." data-hotkey=s,/ autocapitalize="off" data-analytics-event="{"location":"navbar","action":"searchbar","context":"global","tag":"input","label":"searchbar_input_global_navbar"}" data-action="click:qbsearch-input#handleExpand" > <div class="mr-2 color-fg-muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </div> <span class="flex-1" data-target="qbsearch-input.inputButtonText">Search or jump to...</span> <div class="d-flex" data-target="qbsearch-input.hotkeyIndicator"> <svg xmlns="http://www.w3.org/2000/svg" width="22" height="20" aria-hidden="true" class="mr-1"><path fill="none" stroke="#979A9C" opacity=".4" d="M3.5.5h12c1.7 0 3 1.3 3 3v13c0 1.7-1.3 3-3 3h-12c-1.7 0-3-1.3-3-3v-13c0-1.7 1.3-3 3-3z"></path><path fill="#979A9C" d="M11.8 6L8 15.1h-.9L10.8 6h1z"></path></svg> </div> </button> <input type="hidden" name="type" class="js-site-search-type-field"> <div class="Overlay--hidden " data-modal-dialog-overlay> <modal-dialog data-action="close:qbsearch-input#handleClose cancel:qbsearch-input#handleClose" data-target="qbsearch-input.searchSuggestionsDialog" role="dialog" id="search-suggestions-dialog" aria-modal="true" aria-labelledby="search-suggestions-dialog-header" data-view-component="true" class="Overlay Overlay--width-large Overlay--height-auto"> <h1 id="search-suggestions-dialog-header" class="sr-only">Search code, repositories, users, issues, pull requests...</h1> <div class="Overlay-body Overlay-body--paddingNone"> <div data-view-component="true"> <div class="search-suggestions position-fixed width-full color-shadow-large border color-fg-default color-bg-default overflow-hidden d-flex flex-column query-builder-container" style="border-radius: 12px;" data-target="qbsearch-input.queryBuilderContainer" hidden > <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="query-builder-test-form" action="" accept-charset="UTF-8" method="get"> <query-builder data-target="qbsearch-input.queryBuilder" id="query-builder-query-builder-test" data-filter-key=":" data-view-component="true" class="QueryBuilder search-query-builder"> <div class="FormControl FormControl--fullWidth"> <label id="query-builder-test-label" for="query-builder-test" class="FormControl-label sr-only"> Search </label> <div class="QueryBuilder-StyledInput width-fit " data-target="query-builder.styledInput" > <span id="query-builder-test-leadingvisual-wrap" class="FormControl-input-leadingVisualWrap QueryBuilder-leadingVisualWrap"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search FormControl-input-leadingVisual"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </span> <div data-target="query-builder.styledInputContainer" class="QueryBuilder-StyledInputContainer"> <div aria-hidden="true" class="QueryBuilder-StyledInputContent" data-target="query-builder.styledInputContent" ></div> <div class="QueryBuilder-InputWrapper"> <div aria-hidden="true" class="QueryBuilder-Sizer" data-target="query-builder.sizer"></div> <input id="query-builder-test" name="query-builder-test" value="" autocomplete="off" type="text" role="combobox" spellcheck="false" aria-expanded="false" aria-describedby="validation-571946ed-4402-453b-99a9-c89e7553f9e9" data-target="query-builder.input" data-action=" input:query-builder#inputChange blur:query-builder#inputBlur keydown:query-builder#inputKeydown focus:query-builder#inputFocus " data-view-component="true" class="FormControl-input QueryBuilder-Input FormControl-medium" /> </div> </div> <span class="sr-only" id="query-builder-test-clear">Clear</span> <button role="button" id="query-builder-test-clear-button" aria-labelledby="query-builder-test-clear query-builder-test-label" data-target="query-builder.clearButton" data-action=" click:query-builder#clear focus:query-builder#clearButtonFocus blur:query-builder#clearButtonBlur " variant="small" hidden="hidden" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium mr-1 px-2 py-0 d-flex flex-items-center rounded-1 color-fg-muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x-circle-fill Button-visual"> <path d="M2.343 13.657A8 8 0 1 1 13.658 2.343 8 8 0 0 1 2.343 13.657ZM6.03 4.97a.751.751 0 0 0-1.042.018.751.751 0 0 0-.018 1.042L6.94 8 4.97 9.97a.749.749 0 0 0 .326 1.275.749.749 0 0 0 .734-.215L8 9.06l1.97 1.97a.749.749 0 0 0 1.275-.326.749.749 0 0 0-.215-.734L9.06 8l1.97-1.97a.749.749 0 0 0-.326-1.275.749.749 0 0 0-.734.215L8 6.94Z"></path> </svg> </button> </div> <template id="search-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </template> <template id="code-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </template> <template id="file-code-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-file-code"> <path d="M4 1.75C4 .784 4.784 0 5.75 0h5.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v8.586A1.75 1.75 0 0 1 14.25 15h-9a.75.75 0 0 1 0-1.5h9a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 10 4.25V1.5H5.75a.25.25 0 0 0-.25.25v2.5a.75.75 0 0 1-1.5 0Zm1.72 4.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734l1.47-1.47-1.47-1.47a.75.75 0 0 1 0-1.06ZM3.28 7.78 1.81 9.25l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Zm8.22-6.218V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path> </svg> </template> <template id="history-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-history"> <path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path> </svg> </template> <template id="repo-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo"> <path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path> </svg> </template> <template id="bookmark-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bookmark"> <path d="M3 2.75C3 1.784 3.784 1 4.75 1h6.5c.966 0 1.75.784 1.75 1.75v11.5a.75.75 0 0 1-1.227.579L8 11.722l-3.773 3.107A.751.751 0 0 1 3 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.91l3.023-2.489a.75.75 0 0 1 .954 0l3.023 2.49V2.75a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="plus-circle-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-plus-circle"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm7.25-3.25v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5a.75.75 0 0 1 1.5 0Z"></path> </svg> </template> <template id="circle-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> </template> <template id="trash-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-trash"> <path d="M11 1.75V3h2.25a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5H5V1.75C5 .784 5.784 0 6.75 0h2.5C10.216 0 11 .784 11 1.75ZM4.496 6.675l.66 6.6a.25.25 0 0 0 .249.225h5.19a.25.25 0 0 0 .249-.225l.66-6.6a.75.75 0 0 1 1.492.149l-.66 6.6A1.748 1.748 0 0 1 10.595 15h-5.19a1.75 1.75 0 0 1-1.741-1.575l-.66-6.6a.75.75 0 1 1 1.492-.15ZM6.5 1.75V3h3V1.75a.25.25 0 0 0-.25-.25h-2.5a.25.25 0 0 0-.25.25Z"></path> </svg> </template> <template id="team-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-people"> <path d="M2 5.5a3.5 3.5 0 1 1 5.898 2.549 5.508 5.508 0 0 1 3.034 4.084.75.75 0 1 1-1.482.235 4 4 0 0 0-7.9 0 .75.75 0 0 1-1.482-.236A5.507 5.507 0 0 1 3.102 8.05 3.493 3.493 0 0 1 2 5.5ZM11 4a3.001 3.001 0 0 1 2.22 5.018 5.01 5.01 0 0 1 2.56 3.012.749.749 0 0 1-.885.954.752.752 0 0 1-.549-.514 3.507 3.507 0 0 0-2.522-2.372.75.75 0 0 1-.574-.73v-.352a.75.75 0 0 1 .416-.672A1.5 1.5 0 0 0 11 5.5.75.75 0 0 1 11 4Zm-5.5-.5a2 2 0 1 0-.001 3.999A2 2 0 0 0 5.5 3.5Z"></path> </svg> </template> <template id="project-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-project"> <path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0ZM1.5 1.75v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25ZM11.75 3a.75.75 0 0 1 .75.75v7.5a.75.75 0 0 1-1.5 0v-7.5a.75.75 0 0 1 .75-.75Zm-8.25.75a.75.75 0 0 1 1.5 0v5.5a.75.75 0 0 1-1.5 0ZM8 3a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 3Z"></path> </svg> </template> <template id="pencil-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pencil"> <path d="M11.013 1.427a1.75 1.75 0 0 1 2.474 0l1.086 1.086a1.75 1.75 0 0 1 0 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 0 1-.927-.928l.929-3.25c.081-.286.235-.547.445-.758l8.61-8.61Zm.176 4.823L9.75 4.81l-6.286 6.287a.253.253 0 0 0-.064.108l-.558 1.953 1.953-.558a.253.253 0 0 0 .108-.064Zm1.238-3.763a.25.25 0 0 0-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 0 0 0-.354Z"></path> </svg> </template> <template id="copilot-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copilot"> <path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path> </svg> </template> <template id="copilot-error-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copilot-error"> <path d="M16 11.24c0 .112-.072.274-.21.467L13 9.688V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-.198 0-.388-.009-.571-.029L6.833 5.226a4.01 4.01 0 0 0 .17-.782c.117-.935-.037-1.395-.241-1.614-.193-.206-.637-.413-1.682-.297-.683.076-1.115.231-1.395.415l-1.257-.91c.579-.564 1.413-.877 2.485-.996 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095Zm-5.083-8.707c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Zm2.511 11.074c-1.393.776-3.272 1.428-5.43 1.428-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.18-.455-.241-.963-.252-1.475L.31 4.107A.747.747 0 0 1 0 3.509V3.49a.748.748 0 0 1 .625-.73c.156-.026.306.047.435.139l14.667 10.578a.592.592 0 0 1 .227.264.752.752 0 0 1 .046.249v.022a.75.75 0 0 1-1.19.596Zm-1.367-.991L5.635 7.964a5.128 5.128 0 0 1-.889.073c-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433 1.539 0 3.089-.505 4.063-.934Z"></path> </svg> </template> <template id="workflow-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-workflow"> <path d="M0 1.75C0 .784.784 0 1.75 0h3.5C6.216 0 7 .784 7 1.75v3.5A1.75 1.75 0 0 1 5.25 7H4v4a1 1 0 0 0 1 1h4v-1.25C9 9.784 9.784 9 10.75 9h3.5c.966 0 1.75.784 1.75 1.75v3.5A1.75 1.75 0 0 1 14.25 16h-3.5A1.75 1.75 0 0 1 9 14.25v-.75H5A2.5 2.5 0 0 1 2.5 11V7h-.75A1.75 1.75 0 0 1 0 5.25Zm1.75-.25a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Zm9 9a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="book-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book"> <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path> </svg> </template> <template id="code-review-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-review"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 13H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25v-8.5C0 1.784.784 1 1.75 1ZM1.5 2.75v8.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-8.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Zm5.28 1.72a.75.75 0 0 1 0 1.06L5.31 7l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.75.75 0 0 1 1.06 0Zm2.44 0a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L10.69 7 9.22 5.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </template> <template id="codespaces-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-codespaces"> <path d="M0 11.25c0-.966.784-1.75 1.75-1.75h12.5c.966 0 1.75.784 1.75 1.75v3A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm2-9.5C2 .784 2.784 0 3.75 0h8.5C13.216 0 14 .784 14 1.75v5a1.75 1.75 0 0 1-1.75 1.75h-8.5A1.75 1.75 0 0 1 2 6.75Zm1.75-.25a.25.25 0 0 0-.25.25v5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5a.25.25 0 0 0-.25-.25Zm-2 9.5a.25.25 0 0 0-.25.25v3c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-3a.25.25 0 0 0-.25-.25Z"></path><path d="M7 12.75a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path> </svg> </template> <template id="comment-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment"> <path d="M1 2.75C1 1.784 1.784 1 2.75 1h10.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 13.25 12H9.06l-2.573 2.573A1.458 1.458 0 0 1 4 13.543V12H2.75A1.75 1.75 0 0 1 1 10.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h4.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="comment-discussion-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment-discussion"> <path d="M1.75 1h8.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 10.25 10H7.061l-2.574 2.573A1.458 1.458 0 0 1 2 11.543V10h-.25A1.75 1.75 0 0 1 0 8.25v-5.5C0 1.784.784 1 1.75 1ZM1.5 2.75v5.5c0 .138.112.25.25.25h1a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h3.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25Zm13 2a.25.25 0 0 0-.25-.25h-.5a.75.75 0 0 1 0-1.5h.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 14.25 12H14v1.543a1.458 1.458 0 0 1-2.487 1.03L9.22 12.28a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l2.22 2.22v-2.19a.75.75 0 0 1 .75-.75h1a.25.25 0 0 0 .25-.25Z"></path> </svg> </template> <template id="organization-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-organization"> <path d="M1.75 16A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0h8.5C11.216 0 12 .784 12 1.75v12.5c0 .085-.006.168-.018.25h2.268a.25.25 0 0 0 .25-.25V8.285a.25.25 0 0 0-.111-.208l-1.055-.703a.749.749 0 1 1 .832-1.248l1.055.703c.487.325.779.871.779 1.456v5.965A1.75 1.75 0 0 1 14.25 16h-3.5a.766.766 0 0 1-.197-.026c-.099.017-.2.026-.303.026h-3a.75.75 0 0 1-.75-.75V14h-1v1.25a.75.75 0 0 1-.75.75Zm-.25-1.75c0 .138.112.25.25.25H4v-1.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 .75.75v1.25h2.25a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25ZM3.75 6h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM3 3.75A.75.75 0 0 1 3.75 3h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 3.75Zm4 3A.75.75 0 0 1 7.75 6h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 7 6.75ZM7.75 3h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM3 9.75A.75.75 0 0 1 3.75 9h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 9.75ZM7.75 9h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5Z"></path> </svg> </template> <template id="rocket-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-rocket"> <path d="M14.064 0h.186C15.216 0 16 .784 16 1.75v.186a8.752 8.752 0 0 1-2.564 6.186l-.458.459c-.314.314-.641.616-.979.904v3.207c0 .608-.315 1.172-.833 1.49l-2.774 1.707a.749.749 0 0 1-1.11-.418l-.954-3.102a1.214 1.214 0 0 1-.145-.125L3.754 9.816a1.218 1.218 0 0 1-.124-.145L.528 8.717a.749.749 0 0 1-.418-1.11l1.71-2.774A1.748 1.748 0 0 1 3.31 4h3.204c.288-.338.59-.665.904-.979l.459-.458A8.749 8.749 0 0 1 14.064 0ZM8.938 3.623h-.002l-.458.458c-.76.76-1.437 1.598-2.02 2.5l-1.5 2.317 2.143 2.143 2.317-1.5c.902-.583 1.74-1.26 2.499-2.02l.459-.458a7.25 7.25 0 0 0 2.123-5.127V1.75a.25.25 0 0 0-.25-.25h-.186a7.249 7.249 0 0 0-5.125 2.123ZM3.56 14.56c-.732.732-2.334 1.045-3.005 1.148a.234.234 0 0 1-.201-.064.234.234 0 0 1-.064-.201c.103-.671.416-2.273 1.15-3.003a1.502 1.502 0 1 1 2.12 2.12Zm6.94-3.935c-.088.06-.177.118-.266.175l-2.35 1.521.548 1.783 1.949-1.2a.25.25 0 0 0 .119-.213ZM3.678 8.116 5.2 5.766c.058-.09.117-.178.176-.266H3.309a.25.25 0 0 0-.213.119l-1.2 1.95ZM12 5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> </template> <template id="shield-check-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield-check"> <path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </template> <template id="heart-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-heart"> <path d="m8 14.25.345.666a.75.75 0 0 1-.69 0l-.008-.004-.018-.01a7.152 7.152 0 0 1-.31-.17 22.055 22.055 0 0 1-3.434-2.414C2.045 10.731 0 8.35 0 5.5 0 2.836 2.086 1 4.25 1 5.797 1 7.153 1.802 8 3.02 8.847 1.802 10.203 1 11.75 1 13.914 1 16 2.836 16 5.5c0 2.85-2.045 5.231-3.885 6.818a22.066 22.066 0 0 1-3.744 2.584l-.018.01-.006.003h-.002ZM4.25 2.5c-1.336 0-2.75 1.164-2.75 3 0 2.15 1.58 4.144 3.365 5.682A20.58 20.58 0 0 0 8 13.393a20.58 20.58 0 0 0 3.135-2.211C12.92 9.644 14.5 7.65 14.5 5.5c0-1.836-1.414-3-2.75-3-1.373 0-2.609.986-3.029 2.456a.749.749 0 0 1-1.442 0C6.859 3.486 5.623 2.5 4.25 2.5Z"></path> </svg> </template> <template id="server-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-server"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v4c0 .372-.116.717-.314 1 .198.283.314.628.314 1v4a1.75 1.75 0 0 1-1.75 1.75H1.75A1.75 1.75 0 0 1 0 12.75v-4c0-.358.109-.707.314-1a1.739 1.739 0 0 1-.314-1v-4C0 1.784.784 1 1.75 1ZM1.5 2.75v4c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Zm.25 5.75a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25ZM7 4.75A.75.75 0 0 1 7.75 4h4.5a.75.75 0 0 1 0 1.5h-4.5A.75.75 0 0 1 7 4.75ZM7.75 10h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM3 4.75A.75.75 0 0 1 3.75 4h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 4.75ZM3.75 10h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5Z"></path> </svg> </template> <template id="globe-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-globe"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM5.78 8.75a9.64 9.64 0 0 0 1.363 4.177c.255.426.542.832.857 1.215.245-.296.551-.705.857-1.215A9.64 9.64 0 0 0 10.22 8.75Zm4.44-1.5a9.64 9.64 0 0 0-1.363-4.177c-.307-.51-.612-.919-.857-1.215a9.927 9.927 0 0 0-.857 1.215A9.64 9.64 0 0 0 5.78 7.25Zm-5.944 1.5H1.543a6.507 6.507 0 0 0 4.666 5.5c-.123-.181-.24-.365-.352-.552-.715-1.192-1.437-2.874-1.581-4.948Zm-2.733-1.5h2.733c.144-2.074.866-3.756 1.58-4.948.12-.197.237-.381.353-.552a6.507 6.507 0 0 0-4.666 5.5Zm10.181 1.5c-.144 2.074-.866 3.756-1.58 4.948-.12.197-.237.381-.353.552a6.507 6.507 0 0 0 4.666-5.5Zm2.733-1.5a6.507 6.507 0 0 0-4.666-5.5c.123.181.24.365.353.552.714 1.192 1.436 2.874 1.58 4.948Z"></path> </svg> </template> <template id="issue-opened-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> </template> <template id="device-mobile-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-device-mobile"> <path d="M3.75 0h8.5C13.216 0 14 .784 14 1.75v12.5A1.75 1.75 0 0 1 12.25 16h-8.5A1.75 1.75 0 0 1 2 14.25V1.75C2 .784 2.784 0 3.75 0ZM3.5 1.75v12.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25ZM8 13a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path> </svg> </template> <template id="package-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-package"> <path d="m8.878.392 5.25 3.045c.54.314.872.89.872 1.514v6.098a1.75 1.75 0 0 1-.872 1.514l-5.25 3.045a1.75 1.75 0 0 1-1.756 0l-5.25-3.045A1.75 1.75 0 0 1 1 11.049V4.951c0-.624.332-1.201.872-1.514L7.122.392a1.75 1.75 0 0 1 1.756 0ZM7.875 1.69l-4.63 2.685L8 7.133l4.755-2.758-4.63-2.685a.248.248 0 0 0-.25 0ZM2.5 5.677v5.372c0 .09.047.171.125.216l4.625 2.683V8.432Zm6.25 8.271 4.625-2.683a.25.25 0 0 0 .125-.216V5.677L8.75 8.432Z"></path> </svg> </template> <template id="credit-card-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-credit-card"> <path d="M10.75 9a.75.75 0 0 0 0 1.5h1.5a.75.75 0 0 0 0-1.5h-1.5Z"></path><path d="M0 3.75C0 2.784.784 2 1.75 2h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 14H1.75A1.75 1.75 0 0 1 0 12.25ZM14.5 6.5h-13v5.75c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25Zm0-2.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25V5h13Z"></path> </svg> </template> <template id="play-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> </template> <template id="gift-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-gift"> <path d="M2 2.75A2.75 2.75 0 0 1 4.75 0c.983 0 1.873.42 2.57 1.232.268.318.497.668.68 1.042.183-.375.411-.725.68-1.044C9.376.42 10.266 0 11.25 0a2.75 2.75 0 0 1 2.45 4h.55c.966 0 1.75.784 1.75 1.75v2c0 .698-.409 1.301-1 1.582v4.918A1.75 1.75 0 0 1 13.25 16H2.75A1.75 1.75 0 0 1 1 14.25V9.332C.409 9.05 0 8.448 0 7.75v-2C0 4.784.784 4 1.75 4h.55c-.192-.375-.3-.8-.3-1.25ZM7.25 9.5H2.5v4.75c0 .138.112.25.25.25h4.5Zm1.5 0v5h4.5a.25.25 0 0 0 .25-.25V9.5Zm0-4V8h5.5a.25.25 0 0 0 .25-.25v-2a.25.25 0 0 0-.25-.25Zm-7 0a.25.25 0 0 0-.25.25v2c0 .138.112.25.25.25h5.5V5.5h-5.5Zm3-4a1.25 1.25 0 0 0 0 2.5h2.309c-.233-.818-.542-1.401-.878-1.793-.43-.502-.915-.707-1.431-.707ZM8.941 4h2.309a1.25 1.25 0 0 0 0-2.5c-.516 0-1 .205-1.43.707-.337.392-.646.975-.879 1.793Z"></path> </svg> </template> <template id="code-square-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-square"> <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25Zm7.47 3.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L10.69 8 9.22 6.53a.75.75 0 0 1 0-1.06ZM6.78 6.53 5.31 8l1.47 1.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </template> <template id="device-desktop-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-device-desktop"> <path d="M14.25 1c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 14.25 12h-3.727c.099 1.041.52 1.872 1.292 2.757A.752.752 0 0 1 11.25 16h-6.5a.75.75 0 0 1-.565-1.243c.772-.885 1.192-1.716 1.292-2.757H1.75A1.75 1.75 0 0 1 0 10.25v-7.5C0 1.784.784 1 1.75 1ZM1.75 2.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25ZM9.018 12H6.982a5.72 5.72 0 0 1-.765 2.5h3.566a5.72 5.72 0 0 1-.765-2.5Z"></path> </svg> </template> <div class="position-relative"> <ul role="listbox" class="ActionListWrap QueryBuilder-ListWrap" aria-label="Suggestions" data-action=" combobox-commit:query-builder#comboboxCommit mousedown:query-builder#resultsMousedown " data-target="query-builder.resultsList" data-persist-list=false id="query-builder-test-results" ></ul> </div> <div class="FormControl-inlineValidation" id="validation-571946ed-4402-453b-99a9-c89e7553f9e9" hidden="hidden"> <span class="FormControl-inlineValidation--visual"> <svg aria-hidden="true" height="12" viewBox="0 0 12 12" version="1.1" width="12" data-view-component="true" class="octicon octicon-alert-fill"> <path d="M4.855.708c.5-.896 1.79-.896 2.29 0l4.675 8.351a1.312 1.312 0 0 1-1.146 1.954H1.33A1.313 1.313 0 0 1 .183 9.058ZM7 7V3H5v4Zm-1 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z"></path> </svg> </span> <span></span> </div> </div> <div data-target="query-builder.screenReaderFeedback" aria-live="polite" aria-atomic="true" class="sr-only"></div> </query-builder></form> <div class="d-flex flex-row color-fg-muted px-3 text-small color-bg-default search-feedback-prompt"> <a target="_blank" href="https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax" data-view-component="true" class="Link color-fg-accent text-normal ml-2">Search syntax tips</a> <div class="d-flex flex-1"></div> </div> </div> </div> </div> </modal-dialog></div> </div> <div data-action="click:qbsearch-input#retract" class="dark-backdrop position-fixed" hidden data-target="qbsearch-input.darkBackdrop"></div> <div class="color-fg-default"> <dialog-helper> <dialog data-target="qbsearch-input.feedbackDialog" data-action="close:qbsearch-input#handleDialogClose cancel:qbsearch-input#handleDialogClose" id="feedback-dialog" aria-modal="true" aria-labelledby="feedback-dialog-title" aria-describedby="feedback-dialog-description" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-medium Overlay--motion-scaleFade Overlay--disableScroll"> <div data-view-component="true" class="Overlay-header"> <div class="Overlay-headerContentWrap"> <div class="Overlay-titleWrap"> <h1 class="Overlay-title " id="feedback-dialog-title"> Provide feedback </h1> </div> <div class="Overlay-actionWrap"> <button data-close-dialog-id="feedback-dialog" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg></button> </div> </div> </div> <scrollable-region data-labelled-by="feedback-dialog-title"> <div data-view-component="true" class="Overlay-body"> <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="code-search-feedback-form" data-turbo="false" action="/search/feedback" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="E/etqIOpdr2AK4zewdYMciTlWYvZ6fOgVUoxmHfycevA6FDw+XB1wNg1YxQkHgzFD0lh8N1Isouq7SV3odyINA==" /> <p>We read every piece of feedback, and take your input very seriously.</p> <textarea name="feedback" class="form-control width-full mb-2" style="height: 120px" id="feedback"></textarea> <input name="include_email" id="include_email" aria-label="Include my email address so I can be contacted" class="form-control mr-2" type="checkbox"> <label for="include_email" style="font-weight: normal">Include my email address so I can be contacted</label> </form></div> </scrollable-region> <div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd"> <button data-close-dialog-id="feedback-dialog" type="button" data-view-component="true" class="btn"> Cancel </button> <button form="code-search-feedback-form" data-action="click:qbsearch-input#submitFeedback" type="submit" data-view-component="true" class="btn-primary btn"> Submit feedback </button> </div> </dialog></dialog-helper> <custom-scopes data-target="qbsearch-input.customScopesManager"> <dialog-helper> <dialog data-target="custom-scopes.customScopesModalDialog" data-action="close:qbsearch-input#handleDialogClose cancel:qbsearch-input#handleDialogClose" id="custom-scopes-dialog" aria-modal="true" aria-labelledby="custom-scopes-dialog-title" aria-describedby="custom-scopes-dialog-description" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-medium Overlay--motion-scaleFade Overlay--disableScroll"> <div data-view-component="true" class="Overlay-header Overlay-header--divided"> <div class="Overlay-headerContentWrap"> <div class="Overlay-titleWrap"> <h1 class="Overlay-title " id="custom-scopes-dialog-title"> Saved searches </h1> <h2 id="custom-scopes-dialog-description" class="Overlay-description">Use saved searches to filter your results more quickly</h2> </div> <div class="Overlay-actionWrap"> <button data-close-dialog-id="custom-scopes-dialog" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg></button> </div> </div> </div> <scrollable-region data-labelled-by="custom-scopes-dialog-title"> <div data-view-component="true" class="Overlay-body"> <div data-target="custom-scopes.customScopesModalDialogFlash"></div> <div hidden class="create-custom-scope-form" data-target="custom-scopes.createCustomScopeForm"> <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="custom-scopes-dialog-form" data-turbo="false" action="/search/custom_scopes" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="Xha8DSc86NK2pK2yW254jUiWbeDled4rzCMDc8086KckIuCLIk5mMYCj2j4V4s9yL4loqWapip/VxeN5DUn8JQ==" /> <div data-target="custom-scopes.customScopesModalDialogFlash"></div> <input type="hidden" id="custom_scope_id" name="custom_scope_id" data-target="custom-scopes.customScopesIdField"> <div class="form-group"> <label for="custom_scope_name">Name</label> <auto-check src="/search/custom_scopes/check_name" required only-validate-on-blur="false"> <input type="text" name="custom_scope_name" id="custom_scope_name" data-target="custom-scopes.customScopesNameField" class="form-control" autocomplete="off" placeholder="github-ruby" required maxlength="50"> <input type="hidden" data-csrf="true" value="1Dg3kEmpB38LvNB5dBP2lnFLpN8oyzD/fD+ZsYQShfr8qU3cw0CQxZVDe5pM6tE10IDZ2s9iJ9zXmqJnTte0qw==" /> </auto-check> </div> <div class="form-group"> <label for="custom_scope_query">Query</label> <input type="text" name="custom_scope_query" id="custom_scope_query" data-target="custom-scopes.customScopesQueryField" class="form-control" autocomplete="off" placeholder="(repo:mona/a OR repo:mona/b) AND lang:python" required maxlength="500"> </div> <p class="text-small color-fg-muted"> To see all available qualifiers, see our <a class="Link--inTextBlock" href="https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax">documentation</a>. </p> </form> </div> <div data-target="custom-scopes.manageCustomScopesForm"> <div data-target="custom-scopes.list"></div> </div> </div> </scrollable-region> <div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd Overlay-footer--divided"> <button data-action="click:custom-scopes#customScopesCancel" type="button" data-view-component="true" class="btn"> Cancel </button> <button form="custom-scopes-dialog-form" data-action="click:custom-scopes#customScopesSubmit" data-target="custom-scopes.customScopesSubmitButton" type="submit" data-view-component="true" class="btn-primary btn"> Create saved search </button> </div> </dialog></dialog-helper> </custom-scopes> </div> </qbsearch-input> <div class="position-relative HeaderMenu-link-wrap d-lg-inline-block"> <a href="/login?return_to=https%3A%2F%2Fgithub.com%2Fdotnetcore%2FUtil" class="HeaderMenu-link HeaderMenu-link--sign-in HeaderMenu-button flex-shrink-0 no-underline d-none d-lg-inline-flex border border-lg-0 rounded rounded-lg-0 px-2 py-1" style="margin-left: 12px;" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://github.com/dotnetcore/Util","user_id":null}}" data-hydro-click-hmac="c4798be432629e8767cdd21415d2e7c37207359839cb0876cd7adc6133ace522" data-analytics-event="{"category":"Marketing nav","action":"click to go to homepage","label":"ref_page:Marketing;ref_cta:Sign in;ref_loc:Header"}" > Sign in </a> </div> <a href="/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E&source=header-repo&source_repo=dotnetcore%2FUtil" class="HeaderMenu-link HeaderMenu-link--sign-up HeaderMenu-button flex-shrink-0 d-flex d-lg-inline-flex no-underline border color-border-default rounded px-2 py-1" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://github.com/dotnetcore/Util","user_id":null}}" data-hydro-click-hmac="c4798be432629e8767cdd21415d2e7c37207359839cb0876cd7adc6133ace522" data-analytics-event="{"category":"Sign up","action":"click to sign up for account","label":"ref_page:/<user-name>/<repo-name>;ref_cta:Sign up;ref_loc:header logged out"}" > Sign up </a> <button type="button" class="sr-only js-header-menu-focus-trap d-block d-lg-none">Reseting focus</button> </div> </div> </div> </div> </header> <div hidden="hidden" data-view-component="true" class="js-stale-session-flash stale-session-flash flash flash-warn flash-full"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert"> <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <span class="js-stale-session-flash-signed-in" hidden>You signed in with another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <span class="js-stale-session-flash-signed-out" hidden>You signed out in another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <span class="js-stale-session-flash-switched" hidden>You switched accounts on another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <button id="icon-button-a7117ea8-9a9e-4452-8b68-15450233b274" aria-labelledby="tooltip-e2495142-6e59-4a70-b970-5b3354b9e6e2" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium flash-close js-flash-close"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x Button-visual"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button><tool-tip id="tooltip-e2495142-6e59-4a70-b970-5b3354b9e6e2" for="icon-button-a7117ea8-9a9e-4452-8b68-15450233b274" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip> </div> </div> <div id="start-of-content" class="show-on-focus"></div> <div id="js-flash-container" class="flash-container" data-turbo-replace> <template class="js-flash-template"> <div class="flash flash-full {{ className }}"> <div > <button autofocus class="flash-close js-flash-close" type="button" aria-label="Dismiss this message"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> <div aria-atomic="true" role="alert" class="js-flash-alert"> <div>{{ message }}</div> </div> </div> </div> </template> </div> <div class="application-main " data-commit-hovercards-enabled data-discussion-hovercards-enabled data-issue-and-pr-hovercards-enabled data-project-hovercards-enabled > <div itemscope itemtype="http://schema.org/SoftwareSourceCode" class=""> <main id="js-repo-pjax-container" > <div id="repository-container-header" class="pt-3 hide-full-screen" style="background-color: var(--page-header-bgColor, var(--color-page-header-bg));" data-turbo-replace> <div class="d-flex flex-nowrap flex-justify-end mb-3 px-3 px-lg-5" style="gap: 1rem;"> <div class="flex-auto min-width-0 width-fit"> <div class=" d-flex flex-wrap flex-items-center wb-break-word f3 text-normal"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo color-fg-muted mr-2"> <path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path> </svg> <span class="author flex-self-stretch" itemprop="author"> <a class="url fn" rel="author" data-hovercard-type="organization" data-hovercard-url="/orgs/dotnetcore/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="/dotnetcore"> dotnetcore </a> </span> <span class="mx-1 flex-self-stretch color-fg-muted">/</span> <strong itemprop="name" class="mr-2 flex-self-stretch"> <a data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/dotnetcore/Util">Util</a> </strong> <span></span><span class="Label Label--secondary v-align-middle mr-1">Public</span> </div> </div> <div id="repository-details-container" class="flex-shrink-0" data-turbo-replace style="max-width: 70%;"> <ul class="pagehead-actions flex-shrink-0 d-none d-md-inline" style="padding: 2px 0;"> <li> <a href="/login?return_to=%2Fdotnetcore%2FUtil" rel="nofollow" id="repository-details-watch-button" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"notification subscription menu watch","repository_id":null,"auth_type":"LOG_IN","originating_url":"https://github.com/dotnetcore/Util","user_id":null}}" data-hydro-click-hmac="42ba4f8b7750ed4f594ecb80c364b1d4550e59d9163c252f85440ec979d73be3" aria-label="You must be signed in to change notification settings" data-view-component="true" class="btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bell mr-2"> <path d="M8 16a2 2 0 0 0 1.985-1.75c.017-.137-.097-.25-.235-.25h-3.5c-.138 0-.252.113-.235.25A2 2 0 0 0 8 16ZM3 5a5 5 0 0 1 10 0v2.947c0 .05.015.098.042.139l1.703 2.555A1.519 1.519 0 0 1 13.482 13H2.518a1.516 1.516 0 0 1-1.263-2.36l1.703-2.554A.255.255 0 0 0 3 7.947Zm5-3.5A3.5 3.5 0 0 0 4.5 5v2.947c0 .346-.102.683-.294.97l-1.703 2.556a.017.017 0 0 0-.003.01l.001.006c0 .002.002.004.004.006l.006.004.007.001h10.964l.007-.001.006-.004.004-.006.001-.007a.017.017 0 0 0-.003-.01l-1.703-2.554a1.745 1.745 0 0 1-.294-.97V5A3.5 3.5 0 0 0 8 1.5Z"></path> </svg>Notifications </a> <tool-tip id="tooltip-b0881157-7c70-42b2-b3b0-8aab69d8f98d" for="repository-details-watch-button" popover="manual" data-direction="s" data-type="description" data-view-component="true" class="sr-only position-absolute">You must be signed in to change notification settings</tool-tip> </li> <li> <a icon="repo-forked" id="fork-button" href="/login?return_to=%2Fdotnetcore%2FUtil" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"repo details fork button","repository_id":96299354,"auth_type":"LOG_IN","originating_url":"https://github.com/dotnetcore/Util","user_id":null}}" data-hydro-click-hmac="9bceb081b2080f35baf9205fbb33e4054273a15761372068b997acf140027f01" data-view-component="true" class="btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-2"> <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path> </svg>Fork <span id="repo-network-counter" data-pjax-replace="true" data-turbo-replace="true" title="1,298" data-view-component="true" class="Counter">1.3k</span> </a> </li> <li> <div data-view-component="true" class="BtnGroup d-flex"> <a href="/login?return_to=%2Fdotnetcore%2FUtil" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"star button","repository_id":96299354,"auth_type":"LOG_IN","originating_url":"https://github.com/dotnetcore/Util","user_id":null}}" data-hydro-click-hmac="4bb3e278064784f0e088527889f470e5e08161b626f524fd122048663a162c46" aria-label="You must be signed in to star a repository" data-view-component="true" class="tooltipped tooltipped-sw btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star v-align-text-bottom d-inline-block mr-2"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg><span data-view-component="true" class="d-inline"> Star </span> <span id="repo-stars-counter-star" aria-label="4598 users starred this repository" data-singular-suffix="user starred this repository" data-plural-suffix="users starred this repository" data-turbo-replace="true" title="4,598" data-view-component="true" class="Counter js-social-count">4.6k</span> </a></div> </li> </ul> </div> </div> <div id="responsive-meta-container" data-turbo-replace> <div class="d-block d-md-none mb-2 px-3 px-md-4 px-lg-5"> <p class="f4 mb-3 "> Util是一个.Net平台下的应用框架,旨在提升中小团队的开发能力,由工具类、分层架构基类、Ui组件,配套代码生成模板,权限等组成。 </p> <h3 class="sr-only">License</h3> <div class="mb-2"> <a href="/dotnetcore/Util/blob/master/LICENSE.txt" class="Link--muted" data-analytics-event="{"category":"Repository Overview","action":"click","label":"location:sidebar;file:license"}" > <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-law mr-2"> <path d="M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z"></path> </svg> MIT license </a> </div> <div class="mb-3"> <a class="Link--secondary no-underline mr-3" href="/dotnetcore/Util/stargazers"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star mr-1"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg> <span class="text-bold">4.6k</span> stars </a> <a class="Link--secondary no-underline mr-3" href="/dotnetcore/Util/forks"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-1"> <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path> </svg> <span class="text-bold">1.3k</span> forks </a> <a class="Link--secondary no-underline mr-3 d-inline-block" href="/dotnetcore/Util/branches"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-branch mr-1"> <path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path> </svg> <span>Branches</span> </a> <a class="Link--secondary no-underline d-inline-block" href="/dotnetcore/Util/tags"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-tag mr-1"> <path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path> </svg> <span>Tags</span> </a> <a class="Link--secondary no-underline d-inline-block" href="/dotnetcore/Util/activity"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pulse mr-1"> <path d="M6 2c.306 0 .582.187.696.471L10 10.731l1.304-3.26A.751.751 0 0 1 12 7h3.25a.75.75 0 0 1 0 1.5h-2.742l-1.812 4.528a.751.751 0 0 1-1.392 0L6 4.77 4.696 8.03A.75.75 0 0 1 4 8.5H.75a.75.75 0 0 1 0-1.5h2.742l1.812-4.529A.751.751 0 0 1 6 2Z"></path> </svg> <span>Activity</span> </a> </div> <div class="d-flex flex-wrap gap-2"> <div class="flex-1"> <div data-view-component="true" class="BtnGroup d-flex"> <a href="/login?return_to=%2Fdotnetcore%2FUtil" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"star button","repository_id":96299354,"auth_type":"LOG_IN","originating_url":"https://github.com/dotnetcore/Util","user_id":null}}" data-hydro-click-hmac="4bb3e278064784f0e088527889f470e5e08161b626f524fd122048663a162c46" aria-label="You must be signed in to star a repository" data-view-component="true" class="tooltipped tooltipped-sw btn-sm btn btn-block"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star v-align-text-bottom d-inline-block mr-2"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg><span data-view-component="true" class="d-inline"> Star </span> </a></div> </div> <div class="flex-1"> <a href="/login?return_to=%2Fdotnetcore%2FUtil" rel="nofollow" id="files-overview-watch-button" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"notification subscription menu watch","repository_id":null,"auth_type":"LOG_IN","originating_url":"https://github.com/dotnetcore/Util","user_id":null}}" data-hydro-click-hmac="42ba4f8b7750ed4f594ecb80c364b1d4550e59d9163c252f85440ec979d73be3" aria-label="You must be signed in to change notification settings" data-view-component="true" class="btn-sm btn btn-block"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bell mr-2"> <path d="M8 16a2 2 0 0 0 1.985-1.75c.017-.137-.097-.25-.235-.25h-3.5c-.138 0-.252.113-.235.25A2 2 0 0 0 8 16ZM3 5a5 5 0 0 1 10 0v2.947c0 .05.015.098.042.139l1.703 2.555A1.519 1.519 0 0 1 13.482 13H2.518a1.516 1.516 0 0 1-1.263-2.36l1.703-2.554A.255.255 0 0 0 3 7.947Zm5-3.5A3.5 3.5 0 0 0 4.5 5v2.947c0 .346-.102.683-.294.97l-1.703 2.556a.017.017 0 0 0-.003.01l.001.006c0 .002.002.004.004.006l.006.004.007.001h10.964l.007-.001.006-.004.004-.006.001-.007a.017.017 0 0 0-.003-.01l-1.703-2.554a1.745 1.745 0 0 1-.294-.97V5A3.5 3.5 0 0 0 8 1.5Z"></path> </svg>Notifications </a> <tool-tip id="tooltip-ab7905b8-2f62-47e1-8a18-95bab24e46e6" for="files-overview-watch-button" popover="manual" data-direction="s" data-type="description" data-view-component="true" class="sr-only position-absolute">You must be signed in to change notification settings</tool-tip> </div> <span> </span> </div> </div> </div> <nav data-pjax="#js-repo-pjax-container" aria-label="Repository" data-view-component="true" class="js-repo-nav js-sidenav-container-pjax js-responsive-underlinenav overflow-hidden UnderlineNav px-3 px-md-4 px-lg-5"> <ul data-view-component="true" class="UnderlineNav-body list-style-none"> <li data-view-component="true" class="d-inline-flex"> <a id="code-tab" href="/dotnetcore/Util" data-tab-item="i0code-tab" data-selected-links="repo_source repo_downloads repo_commits repo_releases repo_tags repo_branches repo_packages repo_deployments repo_attestations /dotnetcore/Util" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g c" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Code","target":"UNDERLINE_NAV.TAB"}" aria-current="page" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item selected"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code UnderlineNav-octicon d-none d-sm-inline"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> <span data-content="Code">Code</span> <span id="code-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="issues-tab" href="/dotnetcore/Util/issues" data-tab-item="i1issues-tab" data-selected-links="repo_issues repo_labels repo_milestones /dotnetcore/Util/issues" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g i" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Issues","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened UnderlineNav-octicon d-none d-sm-inline"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> <span data-content="Issues">Issues</span> <span id="issues-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="1" data-view-component="true" class="Counter">1</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="pull-requests-tab" href="/dotnetcore/Util/pulls" data-tab-item="i2pull-requests-tab" data-selected-links="repo_pulls checks /dotnetcore/Util/pulls" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g p" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Pull requests","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request UnderlineNav-octicon d-none d-sm-inline"> <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path> </svg> <span data-content="Pull requests">Pull requests</span> <span id="pull-requests-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="2" data-view-component="true" class="Counter">2</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="actions-tab" href="/dotnetcore/Util/actions" data-tab-item="i3actions-tab" data-selected-links="repo_actions /dotnetcore/Util/actions" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g a" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Actions","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play UnderlineNav-octicon d-none d-sm-inline"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> <span data-content="Actions">Actions</span> <span id="actions-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="projects-tab" href="/dotnetcore/Util/projects" data-tab-item="i4projects-tab" data-selected-links="repo_projects new_repo_project repo_project /dotnetcore/Util/projects" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g b" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Projects","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-table UnderlineNav-octicon d-none d-sm-inline"> <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path> </svg> <span data-content="Projects">Projects</span> <span id="projects-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="0" hidden="hidden" data-view-component="true" class="Counter">0</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="security-tab" href="/dotnetcore/Util/security" data-tab-item="i5security-tab" data-selected-links="security overview alerts policy token_scanning code_scanning /dotnetcore/Util/security" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g s" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Security","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield UnderlineNav-octicon d-none d-sm-inline"> <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <span data-content="Security">Security</span> <include-fragment src="/dotnetcore/Util/security/overall-count" accept="text/fragment+html"></include-fragment> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="insights-tab" href="/dotnetcore/Util/pulse" data-tab-item="i6insights-tab" data-selected-links="repo_graphs repo_contributors dependency_graph dependabot_updates pulse people community /dotnetcore/Util/pulse" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Insights","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph UnderlineNav-octicon d-none d-sm-inline"> <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> <span data-content="Insights">Insights</span> <span id="insights-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> </ul> <div style="visibility:hidden;" data-view-component="true" class="UnderlineNav-actions js-responsive-underlinenav-overflow position-absolute pr-3 pr-md-4 pr-lg-5 right-0"> <action-menu data-select-variant="none" data-view-component="true"> <focus-group direction="vertical" mnemonics retain> <button id="action-menu-41f13bcb-35dc-4ba6-aa91-5176fd6dce0a-button" popovertarget="action-menu-41f13bcb-35dc-4ba6-aa91-5176fd6dce0a-overlay" aria-controls="action-menu-41f13bcb-35dc-4ba6-aa91-5176fd6dce0a-list" aria-haspopup="true" aria-labelledby="tooltip-8f2bcada-242a-405b-92f1-d2925fb6f132" type="button" data-view-component="true" class="Button Button--iconOnly Button--secondary Button--medium UnderlineNav-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-kebab-horizontal Button-visual"> <path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path> </svg> </button><tool-tip id="tooltip-8f2bcada-242a-405b-92f1-d2925fb6f132" for="action-menu-41f13bcb-35dc-4ba6-aa91-5176fd6dce0a-button" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Additional navigation options</tool-tip> <anchored-position data-target="action-menu.overlay" id="action-menu-41f13bcb-35dc-4ba6-aa91-5176fd6dce0a-overlay" anchor="action-menu-41f13bcb-35dc-4ba6-aa91-5176fd6dce0a-button" align="start" side="outside-bottom" anchor-offset="normal" popover="auto" data-view-component="true"> <div data-view-component="true" class="Overlay Overlay--size-auto"> <div data-view-component="true" class="Overlay-body Overlay-body--paddingNone"> <action-list> <div data-view-component="true"> <ul aria-labelledby="action-menu-41f13bcb-35dc-4ba6-aa91-5176fd6dce0a-button" id="action-menu-41f13bcb-35dc-4ba6-aa91-5176fd6dce0a-list" role="menu" data-view-component="true" class="ActionListWrap--inset ActionListWrap"> <li hidden="hidden" data-menu-item="i0code-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-92770cc4-b0e2-4d89-957d-32ca4bde3a88" href="/dotnetcore/Util" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Code </span> </a> </li> <li hidden="hidden" data-menu-item="i1issues-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-3fe5705f-5335-438a-b243-b8a7b90425d0" href="/dotnetcore/Util/issues" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Issues </span> </a> </li> <li hidden="hidden" data-menu-item="i2pull-requests-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-cbaf5036-9c87-48cc-91c3-027327f35195" href="/dotnetcore/Util/pulls" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request"> <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Pull requests </span> </a> </li> <li hidden="hidden" data-menu-item="i3actions-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-a7ec0430-29b2-4ab2-a34e-56ff2d6d4561" href="/dotnetcore/Util/actions" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Actions </span> </a> </li> <li hidden="hidden" data-menu-item="i4projects-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-f0fecd03-4dbf-45aa-876d-326307c89661" href="/dotnetcore/Util/projects" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-table"> <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Projects </span> </a> </li> <li hidden="hidden" data-menu-item="i5security-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-bf7fcb62-3e5a-4789-b185-1feb35de1bce" href="/dotnetcore/Util/security" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield"> <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Security </span> </a> </li> <li hidden="hidden" data-menu-item="i6insights-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-f415d28c-85b6-454d-b4b0-c86bd769c89c" href="/dotnetcore/Util/pulse" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph"> <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Insights </span> </a> </li> </ul> </div></action-list> </div> </div></anchored-position> </focus-group> </action-menu></div> </nav> </div> <turbo-frame id="repo-content-turbo-frame" target="_top" data-turbo-action="advance" class=""> <div id="repo-content-pjax-container" class="repository-content " > <h1 class='sr-only'>dotnetcore/Util</h1> <div class="clearfix container-xl px-md-4 px-lg-5 px-3"> <div> <div style="max-width: 100%" data-view-component="true" class="Layout Layout--flowRow-until-md react-repos-overview-margin Layout--sidebarPosition-end Layout--sidebarPosition-flowRow-end"> <div data-view-component="true" class="Layout-main"> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_dompurify_dist_purify_es_mjs-dd1d3ea6a436.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_tanstack_query-core_build_modern_queryObserver_js-node_modules_tanstack_-defd52-843b41414e0e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_aria-live_aria-live_ts-ui_packages_history_history_ts-ui_packages_promise-with-re-01dc80-b13b6c1d97b0.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_paths_index_ts-04e7ec2d63d9.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_ref-selector_RefSelector_tsx-7496afc3784d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_commit-attribution_index_ts-ui_packages_commit-checks-status_index_ts-ui_packages-762eaa-d78307eadb45.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_code-view-shared_hooks_use-canonical-object_ts-ui_packages_code-view-shared_hooks-c2dbff-5269586204d9.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/repos-overview-5da4c053db4d.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.a490b7c9fa319e5cb069.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repos-overview.0ee7cac3ab511a65d9f9.module.css" /> <react-partial partial-name="repos-overview" data-ssr="true" data-attempted-ssr="true" > <script type="application/json" data-target="react-partial.embeddedData">{"props":{"initialPayload":{"allShortcutsEnabled":false,"path":"/","repo":{"id":96299354,"defaultBranch":"master","name":"Util","ownerLogin":"dotnetcore","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2017-07-05T09:00:23.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/19404084?v=4","public":true,"private":false,"isOrgOwned":true},"currentUser":null,"refInfo":{"name":"master","listCacheKey":"v0:1728938680.0","canEdit":false,"refType":"branch","currentOid":"2f16f3f6b06624fe51a8863eabe181dc29fba72f"},"tree":{"items":[{"name":"build","path":"build","contentType":"directory"},{"name":"src","path":"src","contentType":"directory"},{"name":"test","path":"test","contentType":"directory"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":"Directory.Build.props","path":"Directory.Build.props","contentType":"file"},{"name":"LICENSE.txt","path":"LICENSE.txt","contentType":"file"},{"name":"Util.sln","path":"Util.sln","contentType":"file"},{"name":"clear-bin.ps1","path":"clear-bin.ps1","contentType":"file"},{"name":"readme.md","path":"readme.md","contentType":"file"}],"templateDirectorySuggestionUrl":null,"readme":null,"totalCount":9,"showBranchInfobar":false},"fileTree":null,"fileTreeProcessingTime":null,"foldersToFetch":[],"treeExpanded":false,"symbolsExpanded":false,"isOverview":true,"overview":{"banners":{"shouldRecommendReadme":false,"isPersonalRepo":false,"showUseActionBanner":false,"actionSlug":null,"actionId":null,"showProtectBranchBanner":false,"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_repo","releasePath":"/dotnetcore/Util/releases/new?marketplace=true","showPublishActionBanner":false},"interactionLimitBanner":null,"showInvitationBanner":false,"inviterName":null,"actionsMigrationBannerInfo":{"releaseTags":[],"showImmutableActionsMigrationBanner":false,"initialMigrationStatus":null}},"codeButton":{"contactPath":"/contact","isEnterprise":false,"local":{"protocolInfo":{"httpAvailable":true,"sshAvailable":null,"httpUrl":"https://github.com/dotnetcore/Util.git","showCloneWarning":null,"sshUrl":null,"sshCertificatesRequired":null,"sshCertificatesAvailable":null,"ghCliUrl":"gh repo clone dotnetcore/Util","defaultProtocol":"http","newSshKeyUrl":"/settings/ssh/new","setProtocolPath":"/users/set_protocol"},"platformInfo":{"cloneUrl":"https://desktop.github.com","showVisualStudioCloneButton":false,"visualStudioCloneUrl":"https://windows.github.com","showXcodeCloneButton":false,"xcodeCloneUrl":"xcode://clone?repo=https%3A%2F%2Fgithub.com%2Fdotnetcore%2FUtil","zipballUrl":"/dotnetcore/Util/archive/refs/heads/master.zip"}},"newCodespacePath":"/codespaces/new?hide_repo_select=true\u0026repo=96299354"},"popovers":{"rename":null,"renamedParentRepo":null},"commitCount":"1,161","overviewFiles":[{"displayName":"readme.md","repoName":"Util","refName":"master","path":"readme.md","preferredFileType":"readme","tabName":"README","richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUtil应用框架介绍\u003c/h1\u003e\u003ca id=\"user-content-util应用框架介绍\" class=\"anchor\" aria-label=\"Permalink: Util应用框架介绍\" href=\"#util应用框架介绍\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://github.com/dotnetcore\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/51a97108a29c1dfe7a7eb1e085c9bae378040bcc3dd4c8ae99dbce33137b106c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d656d62657225323070726f6a6563742532306f662d4e43432d3965323063392e737667\" alt=\"Member project of .NET Core Community\" data-canonical-src=\"https://img.shields.io/badge/member%20project%20of-NCC-9e20c9.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://mit-license.org/\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/6581c31c16c1b13ddc2efb92e2ad69a93ddc4a92fd871ff15d401c4c6c9155a4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e737667\" alt=\"GitHub license\" data-canonical-src=\"https://img.shields.io/badge/license-MIT-blue.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ca href=\"https://www.jetbrains.com/?from=Util\" rel=\"nofollow\"\u003e\n \u003cimg src=\"https://github.com/dotnetcore/Home/raw/master/img/jetbrains.svg\" title=\"JetBrains\" style=\"max-width: 100%;\"\u003e\n\u003c/a\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e什么是Util应用框架?\u003c/h2\u003e\u003ca id=\"user-content-什么是util应用框架\" class=\"anchor\" aria-label=\"Permalink: 什么是Util应用框架?\" href=\"#什么是util应用框架\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUtil是一个.Net平台下的应用框架,旨在提升中小团队的开发能力,由工具类、分层架构基类、Ui组件,配套代码生成模板,权限等组成。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUtil应用框架的作者: \u003cstrong\u003e何镇汐\u003c/strong\u003e\u003c/h2\u003e\u003ca id=\"user-content-util应用框架的作者-何镇汐\" class=\"anchor\" aria-label=\"Permalink: Util应用框架的作者: 何镇汐\" href=\"#util应用框架的作者-何镇汐\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUtil应用框架的主要作者为何镇汐。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUtil应用框架的开源协议: \u003cstrong\u003eMIT\u003c/strong\u003e\u003c/h2\u003e\u003ca id=\"user-content-util应用框架的开源协议-mit\" class=\"anchor\" aria-label=\"Permalink: Util应用框架的开源协议: MIT\" href=\"#util应用框架的开源协议-mit\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e这是最宽松的开源协议,意味着可以以任何方式使用该代码。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUtil应用框架的主要贡献者\u003c/h2\u003e\u003ca id=\"user-content-util应用框架的主要贡献者\" class=\"anchor\" aria-label=\"Permalink: Util应用框架的主要贡献者\" href=\"#util应用框架的主要贡献者\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://github.com/jianxuanbing\" title=\"简楚恩\"\u003e汪总\u003c/a\u003e \u003ca href=\"https://github.com/huxingye\"\u003e胡兴业\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e这里只列出了主要贡献者,还有很多开发人员以不同形式对Util做出了宝贵贡献。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUtil应用框架的目标: \u003cstrong\u003e让开发更简单\u003c/strong\u003e\u003c/h2\u003e\u003ca id=\"user-content-util应用框架的目标-让开发更简单\" class=\"anchor\" aria-label=\"Permalink: Util应用框架的目标: 让开发更简单\" href=\"#util应用框架的目标-让开发更简单\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUtil应用框架让你的团队迅速进入业务开发状态,并在开发过程中持续提供帮助。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUtil应用框架的特点: \u003cstrong\u003e简单易用\u003c/strong\u003e\u003c/h2\u003e\u003ca id=\"user-content-util应用框架的特点-简单易用\" class=\"anchor\" aria-label=\"Permalink: Util应用框架的特点: 简单易用\" href=\"#util应用框架的特点-简单易用\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUtil应用框架的设计理念是追求Api简单化,尽量少的配置,不用精确记忆Api,有个模糊印象即可使用。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil应用框架的学习成本相对较低,对于有.Net基础的开发人员,进行常规业务开发,通常在3天内上手。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUtil应用框架开发流程\u003c/h2\u003e\u003ca id=\"user-content-util应用框架开发流程\" class=\"anchor\" aria-label=\"Permalink: Util应用框架开发流程\" href=\"#util应用框架开发流程\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e\u003cem\u003e搜集\u003c/em\u003e - \u003cem\u003e整理\u003c/em\u003e - \u003cem\u003e集成\u003c/em\u003e - \u003cem\u003e封装\u003c/em\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003e每当发现无法满足项目需求时,扩展框架的时刻来临。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e从头造轮子是下策,所以总是先四处\u003cstrong\u003e搜集\u003c/strong\u003e相关资料。对于简单的需求,可能只需要找到一些代码片断即可。对于更专业的问题,需要寻求第三方技术框架的帮助。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e找到解决方案并调试通过后,需要对代码进行\u003cstrong\u003e整理\u003c/strong\u003e,以符合我们的编程风格。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e通常以Nuget包或Npm包的方式进行\u003cstrong\u003e集成\u003c/strong\u003e,为了降低学习成本,需要仔细考虑如何\u003cstrong\u003e封装\u003c/strong\u003e才能让调用者最省力。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e任何有技术含量的工作,均由第三方技术框架完成,Util应用框架仅对技术框架选型并集成封装。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil应用框架只是很薄的一层外观,为复杂的技术框架提供一个简易视图。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e这导致更健壮的实现和更易用的API。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUtil应用框架的使用方式\u003c/h2\u003e\u003ca id=\"user-content-util应用框架的使用方式\" class=\"anchor\" aria-label=\"Permalink: Util应用框架的使用方式\" href=\"#util应用框架的使用方式\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e使用Util应用框架有几种不同的方式。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e最灵活的方式是将Util应用框架的代码复制到你自己的应用框架中,然后可以随意修改它们来满足项目需求。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e不过这种方式的代价也很大,很难合并Util的任何更新,你需要自行维护相当大的代码库。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e由于Util应用框架的体积在不断增长,维护这些代码库可能给你带来不小的负担。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e另一种可行的方式是将Util应用框架作为你的基础库,使用Nuget引入它们,基础的工作让Util应用框架帮你完成,你只需要扩展自己业务领域相关的功能。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e这种方式的限制也很明显,Util提供的功能可能无法满足你的要求。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e解决这个问题的关键是与Util开发团队保持沟通,将你的需求告诉我们。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e对于通用功能,我们会尽量满足,这样会让更多的开发者受益,对于定制需求,我们也会为你提供扩展点,方便你能自行扩展。\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e框架核心\u003c/h2\u003e\u003ca id=\"user-content-框架核心\" class=\"anchor\" aria-label=\"Permalink: 框架核心\" href=\"#框架核心\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e启动器\u003c/h3\u003e\u003ca id=\"user-content-启动器\" class=\"anchor\" aria-label=\"Permalink: 启动器\" href=\"#启动器\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eUtil应用框架在项目启动时,会扫描全部程序集,并自动执行服务注册器,执行相关依赖配置.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e启动器核心代码参考自 \u003ca href=\"https://www.nopcommerce.com\" rel=\"nofollow\"\u003eNopCommerce\u003c/a\u003e .\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e服务注册器\u003c/h3\u003e\u003ca id=\"user-content-服务注册器\" class=\"anchor\" aria-label=\"Permalink: 服务注册器\" href=\"#服务注册器\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e项目启动扫描时,会加载所有的服务注册器,并按顺序执行.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e服务注册器类似其它应用框架的模块概念,但功能有限.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e只能用于配置依赖注入关系,无法获取服务提供程序,所以不能执行复杂的操作.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e依赖注册器\u003c/h3\u003e\u003ca id=\"user-content-依赖注册器\" class=\"anchor\" aria-label=\"Permalink: 依赖注册器\" href=\"#依赖注册器\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e扫描 ISingletonDependency, IScopeDependency, ITransientDependency 接口,并自动配置依赖.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e框架基础\u003c/h2\u003e\u003ca id=\"user-content-框架基础\" class=\"anchor\" aria-label=\"Permalink: 框架基础\" href=\"#框架基础\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e对象到对象映射\u003c/h3\u003e\u003ca id=\"user-content-对象到对象映射\" class=\"anchor\" aria-label=\"Permalink: 对象到对象映射\" href=\"#对象到对象映射\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e技术选型: \u003ca href=\"http://automapper.org/\" rel=\"nofollow\"\u003eAutoMapper\u003c/a\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e对象到对象映射主要用于分层对象之间的转换,比如从实体映射到DTO.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil 在所有对象上添加 \u003cstrong\u003eMapTo\u003c/strong\u003e 扩展方法,自动完成基础配置,如果映射的两端对象属性名相同,则无需配置,直接使用即可.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAOP( 面向切面编程 )\u003c/h3\u003e\u003ca id=\"user-content-aop-面向切面编程-\" class=\"anchor\" aria-label=\"Permalink: AOP( 面向切面编程 )\" href=\"#aop-面向切面编程-\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e技术选型: \u003ca href=\"https://github.com/dotnetcore/AspectCore-Framework\"\u003eAspectCore\u003c/a\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAOP用于在调用方法时进行拦截,在执行前后添加自定义逻辑.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil 主要使用AOP拦截器进行验证.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e对象验证\u003c/h3\u003e\u003ca id=\"user-content-对象验证\" class=\"anchor\" aria-label=\"Permalink: 对象验证\" href=\"#对象验证\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eUtil 使用 DataAnnotation 注解作为基础验证方式,并提供 \u003cstrong\u003e验证规则\u003c/strong\u003e 和 \u003cstrong\u003e验证处理器\u003c/strong\u003e 等构造块进行自定义验证和处理.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil 在实体,DTO等对象上添加了 \u003cstrong\u003eValidate\u003c/strong\u003e 方法, 以标准化的方式进行对象验证.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e异常处理\u003c/h3\u003e\u003ca id=\"user-content-异常处理\" class=\"anchor\" aria-label=\"Permalink: 异常处理\" href=\"#异常处理\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eUtil 提供了 \u003cstrong\u003eWarning\u003c/strong\u003e 类型,表示业务异常,并封装相关异常操作.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e身份认证和授权\u003c/h3\u003e\u003ca id=\"user-content-身份认证和授权\" class=\"anchor\" aria-label=\"Permalink: 身份认证和授权\" href=\"#身份认证和授权\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e技术选型: \u003ca href=\"https://learn.microsoft.com/zh-cn/aspnet/core/security/authentication/identity\" rel=\"nofollow\"\u003eIdentity\u003c/a\u003e, \u003ca href=\"https://github.com/IdentityServer/IdentityServer4\"\u003eIdentity Server 4\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIdentity 是Asp.Net Core自带的身份认证框架,提供用户管理,登录认证等功能.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003eIdentity Server 4 是一个身份认证服务器,用于颁发令牌和验证令牌等操作.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIdentity Server 4 已经停止更新,它的新版本是收费的,Util 仅使用 Identity Server 4 的基础功能,由于它的基础功能已经十分稳定,暂时不需要迁移到其它框架.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003eUtil 除了集成 Identity 和 Identity Server 4,还扩展了Asp.Net Core自定义授权策略,提供简单易行的Api访问控制方法.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil Platform提供了基于角色和资源的权限管理功能,可以轻松设置前端UI菜单和按钮等权限,同时对后端API进行访问控制.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e本地化\u003c/h3\u003e\u003ca id=\"user-content-本地化\" class=\"anchor\" aria-label=\"Permalink: 本地化\" href=\"#本地化\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e技术选型: \u003ca href=\"https://github.com/hishamco/My.Extensions.Localization.Json\"\u003eMy.Extensions.Localization.Json\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil 本地化支持Json文件或自定义数据存储方式.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eMy.Extensions.Localization.Json 提供了Json本地化功能.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e由于无法满足项目需求, 以源码方式引入, 对健壮性和性能进行了提升.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e日志\u003c/h3\u003e\u003ca id=\"user-content-日志\" class=\"anchor\" aria-label=\"Permalink: 日志\" href=\"#日志\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e技术选型: \u003ca href=\"https://serilog.net/\" rel=\"nofollow\"\u003eSerilog\u003c/a\u003e, \u003ca href=\"https://datalust.co/\" rel=\"nofollow\"\u003eSeq\u003c/a\u003e, \u003ca href=\"https://exceptionless.com/\" rel=\"nofollow\"\u003eExceptionless\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSerilog是.Net目前最流行的日志框架,支持结构化日志.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSeq 和 Exceptionless 是日志管理系统,提供了操作日志的界面,可以使用Serilog写入.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil 对它们进行了轻度封装,集成了常用配置,并提供日志上下文等扩展.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e缓存\u003c/h3\u003e\u003ca id=\"user-content-缓存\" class=\"anchor\" aria-label=\"Permalink: 缓存\" href=\"#缓存\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e技术选型: \u003ca href=\"https://github.com/dotnetcore/EasyCaching\"\u003eEasyCaching\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil 集成了内存缓存和Redis缓存两种提供程序.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e事件总线\u003c/h3\u003e\u003ca id=\"user-content-事件总线\" class=\"anchor\" aria-label=\"Permalink: 事件总线\" href=\"#事件总线\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e技术选型: \u003ca href=\"https://github.com/jbogard/MediatR\"\u003eMediatR\u003c/a\u003e, \u003ca href=\"https://dapr.io/\" rel=\"nofollow\"\u003eDapr\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e事件总线分为本地事件总线和集成事件总线.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003eUtil 本地事件总线提供两种实现,默认使用Ioc方式实现,无需外部依赖. 另外引入了 MediatR 框架,它是流行的进程内事件处理框架.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e集成事件总线用于微服务之间消息通信,Util 集成了 Dapr 微服务框架,基于 Dapr 的发布订阅实现集成事件总线.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e模板引擎\u003c/h3\u003e\u003ca id=\"user-content-模板引擎\" class=\"anchor\" aria-label=\"Permalink: 模板引擎\" href=\"#模板引擎\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e技术选型: \u003ca href=\"https://github.com/adoconnection/razorenginecore\"\u003eRazorEngineCore\u003c/a\u003e , \u003ca href=\"https://github.com/Handlebars-Net/Handlebars.Net\"\u003eHandlebars.Net\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil 以源码方式引入 RazorEngineCore ,并进行大量修改.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eRazor 模板引擎目前主要用在 Util 代码生成器.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e图像处理\u003c/h3\u003e\u003ca id=\"user-content-图像处理\" class=\"anchor\" aria-label=\"Permalink: 图像处理\" href=\"#图像处理\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e技术选型: \u003ca href=\"https://sixlabors.com/\" rel=\"nofollow\"\u003eImageSharp\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eImageSharp 是一个图像处理库.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil 使用 ImageSharp 实现动态文本头像生成.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e文件存储\u003c/h3\u003e\u003ca id=\"user-content-文件存储\" class=\"anchor\" aria-label=\"Permalink: 文件存储\" href=\"#文件存储\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e技术选型: \u003ca href=\"http://minio.org.cn/\" rel=\"nofollow\"\u003eMinio\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eMinio 是流行的对象存储系统,适合部署到内部服务器.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil 集成封装了 Minio SDK, 提供 存储桶名称处理策略, 文件名处理策略等构造块进行扩展处理.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e后台任务\u003c/h3\u003e\u003ca id=\"user-content-后台任务\" class=\"anchor\" aria-label=\"Permalink: 后台任务\" href=\"#后台任务\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e技术选型: \u003ca href=\"https://www.quartz-scheduler.net/\" rel=\"nofollow\"\u003eQuartz\u003c/a\u003e , \u003ca href=\"https://www.hangfire.io/\" rel=\"nofollow\"\u003eHangFire\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil 封装了 Quartz 和 HangFire, 用于处理后台任务.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e数据访问\u003c/h3\u003e\u003ca id=\"user-content-数据访问\" class=\"anchor\" aria-label=\"Permalink: 数据访问\" href=\"#数据访问\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003e技术选型: \u003ca href=\"https://docs.microsoft.com/zh-cn/ef/core/\" rel=\"nofollow\"\u003eEntityFrameworkCore\u003c/a\u003e , \u003ca href=\"https://github.com/DapperLib/Dapper\"\u003eDapper\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil数据访问主要使用 EntityFrameworkCore ,它是.Net官方提供的ORM框架,属于重量级数据访问框架.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eEntityFrameworkCore 支持工作单元模式,对复杂的业务处理非常有效,但对复杂的查询操作无能为力.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e可以直接使用 EntityFrameworkCore 执行Sql语句, 但此操作非常原始,效率低下.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eDapper是轻量级数据访问框架, Util引入它并进行封装,用于解决查询问题.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e目前 Util Dapper 封装尚不可用,它还缺乏分页,Lambda表达式支持等高级功能,现在仅用于代码生成读取元数据,后续会进行扩展.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e由于使用国产数据库的需求逐渐增多,后续将考虑引入 \u003ca href=\"https://github.com/dotnetcore/FreeSql\"\u003eFreeSql\u003c/a\u003e 数据访问框架.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e工具类\u003c/h3\u003e\u003ca id=\"user-content-工具类\" class=\"anchor\" aria-label=\"Permalink: 工具类\" href=\"#工具类\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eUtil包含大量工具类,用于处理常用操作.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e类型转换操作\u003c/li\u003e\n\u003cli\u003eLambda操作\u003c/li\u003e\n\u003cli\u003e命令行操作\u003c/li\u003e\n\u003cli\u003e配置操作\u003c/li\u003e\n\u003cli\u003e枚举操作\u003c/li\u003e\n\u003cli\u003eIoc操作\u003c/li\u003e\n\u003cli\u003eJson操作\u003c/li\u003e\n\u003cli\u003e字符串操作\u003c/li\u003e\n\u003cli\u003e时间操作\u003c/li\u003e\n\u003cli\u003eIP操作\u003c/li\u003e\n\u003cli\u003eWeb操作\u003c/li\u003e\n\u003cli\u003e加密操作\u003c/li\u003e\n\u003cli\u003e...\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e架构支持\u003c/h2\u003e\u003ca id=\"user-content-架构支持\" class=\"anchor\" aria-label=\"Permalink: 架构支持\" href=\"#架构支持\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e多租户架构支持\u003c/h3\u003e\u003ca id=\"user-content-多租户架构支持\" class=\"anchor\" aria-label=\"Permalink: 多租户架构支持\" href=\"#多租户架构支持\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSaas系统支持多家客户使用同一系统,客户数据彼此隔离.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil 参考了 \u003ca href=\"https://abp.io/\" rel=\"nofollow\"\u003eABP\u003c/a\u003e 应用框架的多租户架构设计的租户解析和数据过滤部分.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil 多租户架构在独立部署租户数据库方面基于 EntityFrameworkCore 的官方建议,有一些限制.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDDD分层架构支持\u003c/h3\u003e\u003ca id=\"user-content-ddd分层架构支持\" class=\"anchor\" aria-label=\"Permalink: DDD分层架构支持\" href=\"#ddd分层架构支持\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUtil 分层架构基于领域驱动设计(DDD) 和 企业应用架构模式(POEAA) 的基础构造块.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e.Net 早期流行的分层架构是三层架构, 对于不熟悉 DDD 的开发人员,可以把它当成三层架构使用,不过术语的变化而已.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e但是对于有一定领域模型使用经验的开发人员,该架构在处理更复杂的业务时可以有效管控复杂性.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e对于复杂模块的开发,该架构与三层架构的主要区别在于,实体是作为简单数据容器,还是作为业务处理的场所.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e对于很多业务领域,将实体对应的业务操作封装到实体本身,可以提升业务表达能力和封装性.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil 分层架构分为四层.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e领域层\u003c/h4\u003e\u003ca id=\"user-content-领域层\" class=\"anchor\" aria-label=\"Permalink: 领域层\" href=\"#领域层\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e领域层是Util分层架构的核心.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e领域层非常纯净, 没有对数据访问和UI的依赖,很容易对该层进行单元测试.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e聚合根\u003c/h5\u003e\u003ca id=\"user-content-聚合根\" class=\"anchor\" aria-label=\"Permalink: 聚合根\" href=\"#聚合根\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e作为并发单元的最外层实体.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e实体\u003c/h5\u003e\u003ca id=\"user-content-实体\" class=\"anchor\" aria-label=\"Permalink: 实体\" href=\"#实体\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e由唯一标识决定的业务对象.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e值对象\u003c/h5\u003e\u003ca id=\"user-content-值对象\" class=\"anchor\" aria-label=\"Permalink: 值对象\" href=\"#值对象\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e表示实体属性值的对象.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e仓储\u003c/h5\u003e\u003ca id=\"user-content-仓储\" class=\"anchor\" aria-label=\"Permalink: 仓储\" href=\"#仓储\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e表示聚合根的集合,用于进行数据访问.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e领域服务\u003c/h5\u003e\u003ca id=\"user-content-领域服务\" class=\"anchor\" aria-label=\"Permalink: 领域服务\" href=\"#领域服务\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e用于封装多个聚合根的操作.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e领域事件\u003c/h5\u003e\u003ca id=\"user-content-领域事件\" class=\"anchor\" aria-label=\"Permalink: 领域事件\" href=\"#领域事件\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e表示实体数据发生变化.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e使用Util本地事件总线发布领域事件.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e有几个标准领域事件:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eEntityChangedEvent - 实体变更事件\u003c/li\u003e\n\u003cli\u003eEntityCreatedEvent - 实体创建事件\u003c/li\u003e\n\u003cli\u003eEntityUpdatedEvent - 实体修改事件\u003c/li\u003e\n\u003cli\u003eEntityDeletedEvent - 实体删除事件\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e基础设施层\u003c/h4\u003e\u003ca id=\"user-content-基础设施层\" class=\"anchor\" aria-label=\"Permalink: 基础设施层\" href=\"#基础设施层\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e对于大多项目,基础设施层主要包含数据访问的实现.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e应用层\u003c/h4\u003e\u003ca id=\"user-content-应用层\" class=\"anchor\" aria-label=\"Permalink: 应用层\" href=\"#应用层\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e集成了领域层和基础设施层,为UI提供服务.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e应用服务\u003c/h5\u003e\u003ca id=\"user-content-应用服务\" class=\"anchor\" aria-label=\"Permalink: 应用服务\" href=\"#应用服务\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e应用服务接收UI请求,并将调用委托给实体,领域服务等构造块完成业务功能.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e对于普通项目,业务逻辑直接在应用服务中实现即可,这与三层架构相似.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e数据传输对象(DTO)\u003c/h5\u003e\u003ca id=\"user-content-数据传输对象dto\" class=\"anchor\" aria-label=\"Permalink: 数据传输对象(DTO)\" href=\"#数据传输对象dto\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e数据传输对象是一种用来传递参数的对象.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch5 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e查询参数对象\u003c/h5\u003e\u003ca id=\"user-content-查询参数对象\" class=\"anchor\" aria-label=\"Permalink: 查询参数对象\" href=\"#查询参数对象\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e查询参数对象是一种专门用来传递查询参数的对象.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e表现层\u003c/h4\u003e\u003ca id=\"user-content-表现层\" class=\"anchor\" aria-label=\"Permalink: 表现层\" href=\"#表现层\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e微服务架构支持\u003c/h3\u003e\u003ca id=\"user-content-微服务架构支持\" class=\"anchor\" aria-label=\"Permalink: 微服务架构支持\" href=\"#微服务架构支持\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUtil 集成了 \u003ca href=\"https://dapr.io/\" rel=\"nofollow\"\u003eDapr\u003c/a\u003e ,它是微软主推的微服务框架.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil 封装了 Dapr Http同步调用,异步事件发布订阅,状态存储等功能.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e并对身份认证,事件日志,事件重发等重要功能进行扩展.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e常见业务功能支持\u003c/h3\u003e\u003ca id=\"user-content-常见业务功能支持\" class=\"anchor\" aria-label=\"Permalink: 常见业务功能支持\" href=\"#常见业务功能支持\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e树形结构支持\u003c/h4\u003e\u003ca id=\"user-content-树形结构支持\" class=\"anchor\" aria-label=\"Permalink: 树形结构支持\" href=\"#树形结构支持\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e有些数据包含层次结构.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil 分层架构包含对树形结构的支持.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e如果使用 Util UI,无论加载树形表格还是树形,继承基类即可实现功能.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e审计支持\u003c/h4\u003e\u003ca id=\"user-content-审计支持\" class=\"anchor\" aria-label=\"Permalink: 审计支持\" href=\"#审计支持\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e大多操作需要记录创建人,创建时间,修改人,修改时间等审计信息.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil支持保存时自动设置审计信息.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil 审计设计参考自 \u003ca href=\"https://abp.io/\" rel=\"nofollow\"\u003eABP\u003c/a\u003e 应用框架.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e逻辑删除支持\u003c/h4\u003e\u003ca id=\"user-content-逻辑删除支持\" class=\"anchor\" aria-label=\"Permalink: 逻辑删除支持\" href=\"#逻辑删除支持\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUtil 支持逻辑删除,删除时更新为已删除状态,查询时自动过滤已删除记录.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil 逻辑删除设计参考自 \u003ca href=\"https://abp.io/\" rel=\"nofollow\"\u003eABP\u003c/a\u003e 应用框架.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e对象变更值支持\u003c/h4\u003e\u003ca id=\"user-content-对象变更值支持\" class=\"anchor\" aria-label=\"Permalink: 对象变更值支持\" href=\"#对象变更值支持\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e修改时可能需要获取对象哪些数据发生了变化.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil 提供多种方式获取对象变更值记录.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e代码生成\u003c/h2\u003e\u003ca id=\"user-content-代码生成\" class=\"anchor\" aria-label=\"Permalink: 代码生成\" href=\"#代码生成\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e由于 Util 采用 DDD分层架构,导致简单需求也需要创建大量的类型.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e手工创建这些类型效率低下,通过代码生成迅速创建它们,可以大幅提升开发效率和质量.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil 配套代码生成器, 简单易用, 可解决大部分机械工作.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e在生成的代码基础上进行修改,比从头开始工作要好得多.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUI 技术选型\u003c/h2\u003e\u003ca id=\"user-content-ui-技术选型\" class=\"anchor\" aria-label=\"Permalink: UI 技术选型\" href=\"#ui-技术选型\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eJs语言\u003c/h3\u003e\u003ca id=\"user-content-js语言\" class=\"anchor\" aria-label=\"Permalink: Js语言\" href=\"#js语言\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ca href=\"https://www.typescriptlang.org/zh/\" rel=\"nofollow\"\u003eTypeScript\u003c/a\u003e\u003c/h4\u003e\u003ca id=\"user-content-typescript\" class=\"anchor\" aria-label=\"Permalink: TypeScript\" href=\"#typescript\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTypeScript 是 微软开发的脚本语言, 扩展了弱类型的 Javascript,提供增强的语法和强类型支持.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e为编辑器代码提示和语法错误检测奠定坚实基础.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eJs框架\u003c/h3\u003e\u003ca id=\"user-content-js框架\" class=\"anchor\" aria-label=\"Permalink: Js框架\" href=\"#js框架\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ca href=\"https://angular.io\" rel=\"nofollow\"\u003eAngular\u003c/a\u003e\u003c/h4\u003e\u003ca id=\"user-content-angular\" class=\"anchor\" aria-label=\"Permalink: Angular\" href=\"#angular\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAngular 是 Google开发的 Js框架.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAngular使用 TypeScript 脚本语言开发, 并采用 \u003ca href=\"https://github.com/ReactiveX/RxJS\"\u003eRxJs\u003c/a\u003e 响应式编程框架.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAngular 是前端Js三大框架之一,另外两个是 Vue 和 React.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil UI 用于开发管理后台,选择 Angular 是因为它的语法最优雅, 也最符合后端开发人员的习惯.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAngular 组件库\u003c/h3\u003e\u003ca id=\"user-content-angular-组件库\" class=\"anchor\" aria-label=\"Permalink: Angular 组件库\" href=\"#angular-组件库\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ca href=\"https://ng.ant.design/\" rel=\"nofollow\"\u003eNg Zorro\u003c/a\u003e\u003c/h4\u003e\u003ca id=\"user-content-ng-zorro\" class=\"anchor\" aria-label=\"Permalink: Ng Zorro\" href=\"#ng-zorro\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eNg Zorro 是阿里 Ant Design 的 Angular 版本,提供 80+ 常用组件,覆盖大部分业务开发场景.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ca href=\"https://ng-alain.com/\" rel=\"nofollow\"\u003eNg Alain\u003c/a\u003e\u003c/h4\u003e\u003ca id=\"user-content-ng-alain\" class=\"anchor\" aria-label=\"Permalink: Ng Alain\" href=\"#ng-alain\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e虽然 Ng Zorro 提供了大量常用组件,但项目开发需要一个集成度更高的环境.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNg Alain 是一个基架项目, 集成了 Ng Zorro 组件,提供业务开发的项目模板,除了菜单导航等框架元素,还有很多开箱即用的业务处理页面模板.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAngular 微前端框架\u003c/h3\u003e\u003ca id=\"user-content-angular-微前端框架\" class=\"anchor\" aria-label=\"Permalink: Angular 微前端框架\" href=\"#angular-微前端框架\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e\u003ca href=\"https://github.com/angular-architects/module-federation-plugin\"\u003eAngular Module Federation\u003c/a\u003e\u003c/h4\u003e\u003ca id=\"user-content-angular-module-federation\" class=\"anchor\" aria-label=\"Permalink: Angular Module Federation\" href=\"#angular-module-federation\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e如果你的项目包含大量 Angular 模块,所有文件在同一个项目中,会导致开发环境卡顿和缓慢.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e发布项目也可能需要很长时间.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e另外,如果某个模块需要进行修改,哪怕只修改一行代码,也需要对所有模块重新发布.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e与后端的微服务类似,微前端是前端的项目拆分方法.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e微前端将不同的 Angular 模块拆分到不同项目中,可以独立开发,独立测试和独立部署.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp dir=\"auto\"\u003e无论你是否使用微服务架构,均可使用微前端拆分方式.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp dir=\"auto\"\u003eAngular Module Federation 是基于Webpack模块联合的Angular微前端解决方案.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUtil Angular UI 特点\u003c/h2\u003e\u003ca id=\"user-content-util-angular-ui-特点\" class=\"anchor\" aria-label=\"Permalink: Util Angular UI 特点\" href=\"#util-angular-ui-特点\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e组件扩展支持\u003c/h3\u003e\u003ca id=\"user-content-组件扩展支持\" class=\"anchor\" aria-label=\"Permalink: 组件扩展支持\" href=\"#组件扩展支持\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e除了支持 Ng Zorro 原生功能外,Util UI还对常用组件进行了扩展.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e最重要的扩展是支持常用组件直接发出 Api 请求,而不用定义额外的服务.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRazor TagHelper 支持\u003c/h3\u003e\u003ca id=\"user-content-razor-taghelper-支持\" class=\"anchor\" aria-label=\"Permalink: Razor TagHelper 支持\" href=\"#razor-taghelper-支持\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUtil Angular UI不仅可以使用 html 页面,还能使用 .Net Razor 页面.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eRazor 页面可以使用 TagHelper 服务端标签.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil 已将大部分 Ng Zorro 组件封装为 TagHelper 标签.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e除了获得强类型提示外,TagHelper 作为抽象层,提供更简洁的标签语法.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e另一个强大之处在于Lambda表达式支持, 可以将DTO直接绑定到 TagHelper 标签上.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e能够从Lambda表达式提取元数据,并自动设置大量常用属性,比如name,验证,模型绑定等.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e前后分离\u003c/h3\u003e\u003ca id=\"user-content-前后分离\" class=\"anchor\" aria-label=\"Permalink: 前后分离\" href=\"#前后分离\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e一些开发人员看到 Util Angular UI 使用 .Net Razor 页面,可能认为 UI 与 .Net 高度耦合,但现在的趋势是前后分离.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e所谓前后分离,是前端UI和后端API没有依赖,更换某一端对另一端没有影响.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e另外,前后分离后,前端UI和后端API可以由不同的开发人员完成.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e.Net Razor页面仅在开发阶段提供帮助,在发布时, Razor 页面会转换为 html ,后续发布流程与纯前端开发方式相同.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e一旦发布成功,将完全脱离.Net 环境,可以使用 Nginx 容器承载它.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e发布后的产物,与你使用纯前端方式开发打包没有区别.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e如果你喜欢,可以把后端API换成JAVA,也能正常运行.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e配套Api支持\u003c/h3\u003e\u003ca id=\"user-content-配套api支持\" class=\"anchor\" aria-label=\"Permalink: 配套Api支持\" href=\"#配套api支持\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e前端UI和后端API的开发是两个完全不同的领域.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e但开发一个功能,又需要前端和后端的配合,他们需要沟通,作出一些约定.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e对于配合不到位的团队,前后端的沟通成本可能很高,另外提供的API可能无法满足UI的需求,从而让前端代码变得畸形.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e通常.Net开发人员的Js编程功底高于常规前端人员,前端人员更擅长样式布局.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil Angular UI 不仅提供对前端组件的封装,同时也为常见功能提供 Api 支持.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e对于使用 Util Angular UI 的团队, 将 UI 和 API 交给同一个.Net开发人员就是最好的选择.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e前端人员仅调整界面样式即可.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e不仅减少了沟通成本, API和前端组件的高度集成封装,让常规功能的开发效率得到大幅提升.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e当然,这对 .Net 开发人员的水平有一定要求.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e本地化支持\u003c/h3\u003e\u003ca id=\"user-content-本地化支持\" class=\"anchor\" aria-label=\"Permalink: 本地化支持\" href=\"#本地化支持\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e得益于 Ng Alain 本地化的良好设计, 可以使用 i18n 管道进行文本的本地化转换.\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"'文本' | i18n\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e'文本' | i18n\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e不过对于需要支持本地化的项目,这依然是一个负担,每个表单项,每个表格项,每个文本,可能都需要添加 i18n 管道.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil Angular UI 让本地化开发更进一步,对大部分组件提供了本地化支持,只有极少数文本需要手工添加 i18n 管道.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e授权访问支持\u003c/h3\u003e\u003ca id=\"user-content-授权访问支持\" class=\"anchor\" aria-label=\"Permalink: 授权访问支持\" href=\"#授权访问支持\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eNg Alain提供了授权访问的支持.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil Platform权限模块基于资源和角色的设计,可以很好的与 Ng Alain授权进行集成.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e你可以控制菜单和任意区域根据权限显示和隐藏.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e微前端支持\u003c/h3\u003e\u003ca id=\"user-content-微前端支持\" class=\"anchor\" aria-label=\"Permalink: 微前端支持\" href=\"#微前端支持\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUtil Angular UI 引入了 \u003ca href=\"https://github.com/angular-architects/module-federation-plugin\"\u003eAngular Module Federation\u003c/a\u003e , 能够将 Angular 模块拆分到不同项目中,可以独立开发,独立测试和独立部署.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e对于大中型项目,这是非常有必要的.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUtil Angular UI 功能列表\u003c/h2\u003e\u003ca id=\"user-content-util-angular-ui-功能列表\" class=\"anchor\" aria-label=\"Permalink: Util Angular UI 功能列表\" href=\"#util-angular-ui-功能列表\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUtil Angular UI 主要由 util-angular 和 Util.Ui.NgZorro 两个库提供支持.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eutil-angular 功能列表\u003c/h3\u003e\u003ca id=\"user-content-util-angular-功能列表\" class=\"anchor\" aria-label=\"Permalink: util-angular 功能列表\" href=\"#util-angular-功能列表\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://github.com/util-core/util-angular\"\u003eutil-angular\u003c/a\u003e 是一个 Js 库, 由Curd组件基类, Ng Zorro常用组件扩展指令和一组工具类组成.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e基础类型\u003c/h4\u003e\u003ca id=\"user-content-基础类型\" class=\"anchor\" aria-label=\"Permalink: 基础类型\" href=\"#基础类型\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003eViewModel - 视图模型基类\u003c/li\u003e\n\u003cli\u003eTreeViewModel - 树形视图模型基类\u003c/li\u003e\n\u003cli\u003eTreeNode - 树形节点基类\u003c/li\u003e\n\u003cli\u003ePageList - 分页列表\u003c/li\u003e\n\u003cli\u003eQueryParameter - 查询参数基类\u003c/li\u003e\n\u003cli\u003eTreeQueryParameter - 树形查询参数基类\u003c/li\u003e\n\u003cli\u003eResult - 服务端返回结果\u003c/li\u003e\n\u003cli\u003eStateCode - 服务端状态码约定\u003c/li\u003e\n\u003cli\u003eSelectItem - 列表项\u003c/li\u003e\n\u003cli\u003eSelectList - 列表\u003c/li\u003e\n\u003cli\u003eSelectOptionGroup - 列表配置组\u003c/li\u003e\n\u003cli\u003eSelectOption - 列表配置项\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e工具类\u003c/h4\u003e\u003ca id=\"user-content-工具类-1\" class=\"anchor\" aria-label=\"Permalink: 工具类\" href=\"#工具类-1\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e浏览器本地存储操作\u003c/li\u003e\n\u003cli\u003eCookie操作\u003c/li\u003e\n\u003cli\u003e事件总线操作\u003c/li\u003e\n\u003cli\u003e本地化操作\u003c/li\u003e\n\u003cli\u003eIoc操作\u003c/li\u003e\n\u003cli\u003e加载操作\u003c/li\u003e\n\u003cli\u003e路由操作\u003c/li\u003e\n\u003cli\u003e弹出层操作\u003c/li\u003e\n\u003cli\u003e抽屉操作\u003c/li\u003e\n\u003cli\u003e表单操作\u003c/li\u003e\n\u003cli\u003eHttp操作\u003c/li\u003e\n\u003cli\u003eWeb Api操作\u003c/li\u003e\n\u003cli\u003e消息操作\u003c/li\u003e\n\u003cli\u003e...\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCrud组件基类\u003c/h4\u003e\u003ca id=\"user-content-crud组件基类\" class=\"anchor\" aria-label=\"Permalink: Crud组件基类\" href=\"#crud组件基类\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e编辑组件基类\u003c/li\u003e\n\u003cli\u003e表格编辑组件基类\u003c/li\u003e\n\u003cli\u003e树形编辑组件基类\u003c/li\u003e\n\u003cli\u003e查询组件基类\u003c/li\u003e\n\u003cli\u003e表格查询组件基类\u003c/li\u003e\n\u003cli\u003e树形表格查询组件基类\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eNg Zorro指令扩展\u003c/h4\u003e\u003ca id=\"user-content-ng-zorro指令扩展\" class=\"anchor\" aria-label=\"Permalink: Ng Zorro指令扩展\" href=\"#ng-zorro指令扩展\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e必填项验证扩展指令\u003c/li\u003e\n\u003cli\u003e验证消息扩展指令\u003c/li\u003e\n\u003cli\u003eNg Zorro 按钮扩展指令\u003c/li\u003e\n\u003cli\u003eNg Zorro 选择框扩展指令\u003c/li\u003e\n\u003cli\u003eNg Zorro 表格扩展指令\u003c/li\u003e\n\u003cli\u003eNg Zorro 表格编辑扩展指令\u003c/li\u003e\n\u003cli\u003eNg Zorro 树形表格扩展指令\u003c/li\u003e\n\u003cli\u003eNg Zorro 树形扩展指令\u003c/li\u003e\n\u003cli\u003eNg Zorro 上传扩展指令\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUtil.Ui.NgZorro 库介绍\u003c/h3\u003e\u003ca id=\"user-content-utiluingzorro-库介绍\" class=\"anchor\" aria-label=\"Permalink: Util.Ui.NgZorro 库介绍\" href=\"#utiluingzorro-库介绍\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUtil.Ui.NgZorro 是一个 C# 类库,包含 TagHelper标签和树形控制器等类型.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e绝大部分 Ng Zorro 组件已经封装.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e由于组件很多,就不一一列出.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUtil Angular UI 已知缺陷\u003c/h2\u003e\u003ca id=\"user-content-util-angular-ui-已知缺陷\" class=\"anchor\" aria-label=\"Permalink: Util Angular UI 已知缺陷\" href=\"#util-angular-ui-已知缺陷\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUtil Angular UI 所有已知缺陷均已解决.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUtil Angular UI 适合你吗?\u003c/h2\u003e\u003ca id=\"user-content-util-angular-ui-适合你吗\" class=\"anchor\" aria-label=\"Permalink: Util Angular UI 适合你吗?\" href=\"#util-angular-ui-适合你吗\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUtil Angular UI 是为 .Net 全栈工程师准备的,如果你喜欢更简洁的语法,希望开发的成本更低,它就适合你.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003e参考应用框架\u003c/h2\u003e\u003ca id=\"user-content-参考应用框架\" class=\"anchor\" aria-label=\"Permalink: 参考应用框架\" href=\"#参考应用框架\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e很明显,闭门造车不可取。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil应用框架大部分依赖以Nuget方式引入,极少部分需要修改源码,则以复制源码方式使用。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e另外,.Net应用框架还有很多优秀的开源项目,从中学习和吸取养分是Util成长的关键。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUtil应用框架主要参考了以下开源项目,从中吸收架构和代码,并以Util风格进行整理。\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://abp.io/\" rel=\"nofollow\"\u003eABP\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://www.nopcommerce.com\" rel=\"nofollow\"\u003eNopCommerce\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://cslanet.com/\" rel=\"nofollow\"\u003eCsla\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUtil应用框架相关资源\u003c/h2\u003e\u003ca id=\"user-content-util应用框架相关资源\" class=\"anchor\" aria-label=\"Permalink: Util应用框架相关资源\" href=\"#util应用框架相关资源\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUtil教程目录\u003c/h3\u003e\u003ca id=\"user-content-util教程目录\" class=\"anchor\" aria-label=\"Permalink: Util教程目录\" href=\"#util教程目录\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e知乎: \u003ca href=\"https://zhuanlan.zhihu.com/p/663947596\" rel=\"nofollow\"\u003ehttps://zhuanlan.zhihu.com/p/663947596\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e掘金: \u003ca href=\"https://juejin.cn/post/7298765809290477607\" rel=\"nofollow\"\u003ehttps://juejin.cn/post/7298765809290477607\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eGithub项目地址\u003c/h3\u003e\u003ca id=\"user-content-github项目地址\" class=\"anchor\" aria-label=\"Permalink: Github项目地址\" href=\"#github项目地址\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eUtil\u003c/strong\u003e \u003ca href=\"https://github.com/dotnetcore/Util\"\u003ehttps://github.com/dotnetcore/Util\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e该项目包含Util应用框架全部源码。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eUtil.Generator\u003c/strong\u003e \u003ca href=\"https://github.com/util-core/Util.Generator\"\u003ehttps://github.com/util-core/Util.Generator\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e该项目提供Util代码生成模板,帮助你迅速创建业务项目基架。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eutil-angular\u003c/strong\u003e \u003ca href=\"https://github.com/util-core/util-angular\"\u003ehttps://github.com/util-core/util-angular\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e该项目是对angular,ng zorro,ng alain前端框架的二次封装Js库,与Util.Ui.NgZorro类库配合使用。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eUtil.Platform.Single\u003c/strong\u003e \u003ca href=\"https://github.com/util-core/Util.Platform.Single\"\u003ehttps://github.com/util-core/Util.Platform.Single\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e使用新的应用框架通常具有高昂的成本,为帮助你减轻初始负担,该项目提供一些常用业务功能,你可以将它作为项目起点。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e目前提供了权限管理模块,可以控制到菜单和按钮,并能基于角色资源对API进行访问控制,后续将不断完善其它常用功能。\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e该项目提供单体和微服务两个版本,Util.Platform.Single是单体版本。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eUtil.Platform.Dapr\u003c/strong\u003e \u003ca href=\"https://github.com/util-core/Util.Platform.Dapr\"\u003ehttps://github.com/util-core/Util.Platform.Dapr\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e它是Util Platform的微服务版本,采用Dapr微服务框架,项目结构参考自eShopOnDapr。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eUtil.Platform.Share\u003c/strong\u003e \u003ca href=\"https://github.com/util-core/Util.Platform.Share\"\u003ehttps://github.com/util-core/Util.Platform.Share\u003c/a\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e包含Util.Platform.Single和Util.Platform.Dapr的共享代码,并发布到Nuget,供两个版本使用。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eGitee项目地址\u003c/h3\u003e\u003ca id=\"user-content-gitee项目地址\" class=\"anchor\" aria-label=\"Permalink: Gitee项目地址\" href=\"#gitee项目地址\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003e由于国内访问Github非常缓慢,现在Util所有项目发布时会在Gitee进行同步更新。\u003c/strong\u003e\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003cstrong\u003eUtil\u003c/strong\u003e \u003ca href=\"https://gitee.com/util-core/util\" rel=\"nofollow\"\u003ehttps://gitee.com/util-core/util\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eUtil.Generator\u003c/strong\u003e \u003ca href=\"https://gitee.com/util-core/Util.Generator\" rel=\"nofollow\"\u003ehttps://gitee.com/util-core/Util.Generator\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eutil-angular\u003c/strong\u003e \u003ca href=\"https://gitee.com/util-core/util-angular\" rel=\"nofollow\"\u003ehttps://gitee.com/util-core/util-angular\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eUtil.Platform.Single\u003c/strong\u003e \u003ca href=\"https://gitee.com/util-core/Util.Platform.Single\" rel=\"nofollow\"\u003ehttps://gitee.com/util-core/Util.Platform.Single\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eUtil.Platform.Dapr\u003c/strong\u003e \u003ca href=\"https://gitee.com/util-core/Util.Platform.Dapr\" rel=\"nofollow\"\u003ehttps://gitee.com/util-core/Util.Platform.Dapr\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eUtil.Platform.Share\u003c/strong\u003e \u003ca href=\"https://gitee.com/util-core/Util.Platform.Share\" rel=\"nofollow\"\u003ehttps://gitee.com/util-core/Util.Platform.Share\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eNuget包\u003c/h3\u003e\u003ca id=\"user-content-nuget包\" class=\"anchor\" aria-label=\"Permalink: Nuget包\" href=\"#nuget包\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003e包名\u003c/th\u003e\n\u003cth\u003e版本\u003c/th\u003e\n\u003cth\u003e下载量\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Core\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/c07f4609b6bedb992b2f35e3d3aed433b436820ef0fd8966aea5c42b8d037d2f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e436f72652e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/c07f4609b6bedb992b2f35e3d3aed433b436820ef0fd8966aea5c42b8d037d2f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e436f72652e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Core.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/4cb78b23b70ac2eb22073590f632714dd04c433fa122f356bd90f4dda27c6c38/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e436f72652e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/4cb78b23b70ac2eb22073590f632714dd04c433fa122f356bd90f4dda27c6c38/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e436f72652e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Core.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.ObjectMapping.AutoMapper\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/0ca4e6cb38637d4b8f561f279e553c61febd79b64212af11e38475c888aceac0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4f626a6563744d617070696e672e4175746f4d61707065722e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/0ca4e6cb38637d4b8f561f279e553c61febd79b64212af11e38475c888aceac0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4f626a6563744d617070696e672e4175746f4d61707065722e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.ObjectMapping.AutoMapper.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/439177052a90a53884477fbfe44a24bd8340ddd09a440b64af74d6bf1b3487a1/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4f626a6563744d617070696e672e4175746f4d61707065722e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/439177052a90a53884477fbfe44a24bd8340ddd09a440b64af74d6bf1b3487a1/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4f626a6563744d617070696e672e4175746f4d61707065722e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.ObjectMapping.AutoMapper.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Aop.AspectCore\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/3589f28c06c1321cb005972d77236638646a1d973d2fc77fdd18c0593a0896a0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e416f702e417370656374436f72652e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/3589f28c06c1321cb005972d77236638646a1d973d2fc77fdd18c0593a0896a0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e416f702e417370656374436f72652e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Aop.AspectCore.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/2cf3f4c3de7488503caf093a51eba66974a1b13789714d9daedb5758bf618518/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e416f702e417370656374436f72652e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/2cf3f4c3de7488503caf093a51eba66974a1b13789714d9daedb5758bf618518/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e416f702e417370656374436f72652e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Aop.AspectCore.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Validation\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/83fc2f5b4ddc1ea9427b670ff66b66cad2a8edea3132848b323c4e9ef7839b96/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e56616c69646174696f6e2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/83fc2f5b4ddc1ea9427b670ff66b66cad2a8edea3132848b323c4e9ef7839b96/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e56616c69646174696f6e2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Validation.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/a4c13303024d0607e817e5f31e821c65645fcea1ddf902c343a8dbfeffa336f7/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e56616c69646174696f6e2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/a4c13303024d0607e817e5f31e821c65645fcea1ddf902c343a8dbfeffa336f7/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e56616c69646174696f6e2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Validation.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Security\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/e26640d4d2e9bdc211c96de890558843f5d5c2489194565130efe6df2d91cb5d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e53656375726974792e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/e26640d4d2e9bdc211c96de890558843f5d5c2489194565130efe6df2d91cb5d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e53656375726974792e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Security.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/ef2c4d6fb0810976409e1cbd32ef96e2173f39957e1840019297b71c52fe3f25/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e53656375726974792e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/ef2c4d6fb0810976409e1cbd32ef96e2173f39957e1840019297b71c52fe3f25/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e53656375726974792e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Security.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Data.Abstractions\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/4a6515d44d0646c44a7b101bcec45edb4fd79edfaafa9baaa69384b68ee7d4fa/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4162737472616374696f6e732e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/4a6515d44d0646c44a7b101bcec45edb4fd79edfaafa9baaa69384b68ee7d4fa/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4162737472616374696f6e732e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Data.Abstractions.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/84b1050da1db99d8862f8b562cde49adbd8e183f7b4723e465e545357fb4aa7a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4162737472616374696f6e732e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/84b1050da1db99d8862f8b562cde49adbd8e183f7b4723e465e545357fb4aa7a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4162737472616374696f6e732e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Data.Abstractions.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.AspNetCore\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/8f2ce382822c90de69576e2357215806157cf5ba712889cded38af733c197f9b/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4173704e6574436f72652e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/8f2ce382822c90de69576e2357215806157cf5ba712889cded38af733c197f9b/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4173704e6574436f72652e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.AspNetCore.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/dd94585903d226712b7611f654a229ee9c8f4052c32334cb4628ea5cb0025caf/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4173704e6574436f72652e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/dd94585903d226712b7611f654a229ee9c8f4052c32334cb4628ea5cb0025caf/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4173704e6574436f72652e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.AspNetCore.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Localization\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/d13ad2641840e8b7455a3aec452f02db6918ed7635cac64e61713984d2e7a95d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4c6f63616c697a6174696f6e2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/d13ad2641840e8b7455a3aec452f02db6918ed7635cac64e61713984d2e7a95d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4c6f63616c697a6174696f6e2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Localization.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/89a258d525d8638e6e45f526b9217e36fe9394d65c60668009ea116dbef1b4dd/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4c6f63616c697a6174696f6e2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/89a258d525d8638e6e45f526b9217e36fe9394d65c60668009ea116dbef1b4dd/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4c6f63616c697a6174696f6e2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Localization.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Logging\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/29ce2fb42f51a35721d7d427cd2ae61306ddde312651939190426f064197a800/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4c6f6767696e672e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/29ce2fb42f51a35721d7d427cd2ae61306ddde312651939190426f064197a800/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4c6f6767696e672e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Logging.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/3947e437800d5c387b1ae763b18d9cd82b4536577d6135cc4c6239fbd64a58e3/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4c6f6767696e672e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/3947e437800d5c387b1ae763b18d9cd82b4536577d6135cc4c6239fbd64a58e3/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4c6f6767696e672e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Logging.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Logging.Serilog\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/617c6d2e601b0d6b042862d4b2adf19aefe7df59f43c1b78f146acbc285a9b9f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4c6f6767696e672e536572696c6f672e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/617c6d2e601b0d6b042862d4b2adf19aefe7df59f43c1b78f146acbc285a9b9f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4c6f6767696e672e536572696c6f672e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Logging.Serilog.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/9ddfac5a2d807829e33556f8261714fd3fe7bea24d564752531d3e70dba083e7/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4c6f6767696e672e536572696c6f672e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/9ddfac5a2d807829e33556f8261714fd3fe7bea24d564752531d3e70dba083e7/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4c6f6767696e672e536572696c6f672e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Logging.Serilog.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Logging.Serilog.Exceptionless\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/b3f8d2c8bf1685cdbdd9b0c9508d31967828c84cd51dcf65359045c478959e95/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4c6f6767696e672e536572696c6f672e457863657074696f6e6c6573732e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/b3f8d2c8bf1685cdbdd9b0c9508d31967828c84cd51dcf65359045c478959e95/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4c6f6767696e672e536572696c6f672e457863657074696f6e6c6573732e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Logging.Serilog.Exceptionless.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/1512ae25973175cc64035fd0a58a184220f00e3019f7e2c8a5638eea1a148dd6/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4c6f6767696e672e536572696c6f672e457863657074696f6e6c6573732e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/1512ae25973175cc64035fd0a58a184220f00e3019f7e2c8a5638eea1a148dd6/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4c6f6767696e672e536572696c6f672e457863657074696f6e6c6573732e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Logging.Serilog.Exceptionless.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Events.Abstractions\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/45cf6513823fe0b22a57f67d0e237e441d15d535bbf03c0d28220b8252abec33/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4576656e74732e4162737472616374696f6e732e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/45cf6513823fe0b22a57f67d0e237e441d15d535bbf03c0d28220b8252abec33/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4576656e74732e4162737472616374696f6e732e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Events.Abstractions.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/284934cfd1b27e013a37e80b5c79fb2b3dab32b040d5cc02397a6c1ed72fb764/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4576656e74732e4162737472616374696f6e732e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/284934cfd1b27e013a37e80b5c79fb2b3dab32b040d5cc02397a6c1ed72fb764/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4576656e74732e4162737472616374696f6e732e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Events.Abstractions.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Events\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/0b0f6275ac4e671b773ee615818f83e10d11bc02f4ca7def6d995798f5249725/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4576656e74732e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/0b0f6275ac4e671b773ee615818f83e10d11bc02f4ca7def6d995798f5249725/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4576656e74732e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Events.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/84b23c4cbe9c37677efd1b94feccdf518d07e7ee16fe607ece03bcd6ac9ae35f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4576656e74732e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/84b23c4cbe9c37677efd1b94feccdf518d07e7ee16fe607ece03bcd6ac9ae35f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4576656e74732e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Events.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Events.MediatR\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/07e8ae9bdc7d38c03b5b70316865a76c1b8d24d204d164121f106472d1c5bc1a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4576656e74732e4d6564696174522e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/07e8ae9bdc7d38c03b5b70316865a76c1b8d24d204d164121f106472d1c5bc1a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4576656e74732e4d6564696174522e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Events.MediatR.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/8659a6ec5766e9b72d9745b9ec735441803477e27b21dc62116116991a2371b3/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4576656e74732e4d6564696174522e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/8659a6ec5766e9b72d9745b9ec735441803477e27b21dc62116116991a2371b3/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4576656e74732e4d6564696174522e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Events.MediatR.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Templates\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/59cc67ec5f6004586d2a7980f40508022f8d70c74c8361127ced191dd9a04aed/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e54656d706c617465732e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/59cc67ec5f6004586d2a7980f40508022f8d70c74c8361127ced191dd9a04aed/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e54656d706c617465732e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Templates.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/8846836a968527f25e227c127d064ae7dd953172ef515cfa31fbc849d9434b39/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e54656d706c617465732e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/8846836a968527f25e227c127d064ae7dd953172ef515cfa31fbc849d9434b39/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e54656d706c617465732e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Templates.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Templates.Razor\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/41f0948c2250d7ab22a8bff04c1bdf33af6e1614cfc6a6c9fc6cc13057b3094f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e54656d706c617465732e52617a6f722e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/41f0948c2250d7ab22a8bff04c1bdf33af6e1614cfc6a6c9fc6cc13057b3094f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e54656d706c617465732e52617a6f722e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Templates.Razor.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/d61062d67ee4f5ac5bc7e665ec9f6b59842db3bb7b0b91eed38c2fd6c2739ced/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e54656d706c617465732e52617a6f722e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/d61062d67ee4f5ac5bc7e665ec9f6b59842db3bb7b0b91eed38c2fd6c2739ced/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e54656d706c617465732e52617a6f722e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Templates.Razor.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Templates.Handlebars\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/cb5371c13521eb65de9cc9424c149578b0ca1297a4b1e8fdc761c0d2cd9a39c9/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e54656d706c617465732e48616e646c65626172732e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/cb5371c13521eb65de9cc9424c149578b0ca1297a4b1e8fdc761c0d2cd9a39c9/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e54656d706c617465732e48616e646c65626172732e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Templates.Handlebars.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/0989936e1d15cce8d69ad87f609a4f6d14aa4bfa0500fed9a4062b88d49d1161/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e54656d706c617465732e48616e646c65626172732e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/0989936e1d15cce8d69ad87f609a4f6d14aa4bfa0500fed9a4062b88d49d1161/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e54656d706c617465732e48616e646c65626172732e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Templates.Handlebars.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Caching\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/e6053a5f31f4001038299fb8cade17d4ba97ef9dfe8ca5e72e2e9d3403ba71f6/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e43616368696e672e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/e6053a5f31f4001038299fb8cade17d4ba97ef9dfe8ca5e72e2e9d3403ba71f6/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e43616368696e672e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Caching.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/20a9ba8d838ee804835307d466eb10f13c5a7b41a24c71dc1c34cbb577d84c7a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e43616368696e672e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/20a9ba8d838ee804835307d466eb10f13c5a7b41a24c71dc1c34cbb577d84c7a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e43616368696e672e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Caching.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Caching.EasyCaching\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/21032afcdd8a227f39795856cc66dfe8261210c814f6873ae7dc10bbfa4dc4c4/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e43616368696e672e4561737943616368696e672e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/21032afcdd8a227f39795856cc66dfe8261210c814f6873ae7dc10bbfa4dc4c4/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e43616368696e672e4561737943616368696e672e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Caching.EasyCaching.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/706c5abc50e8387ecdbb19dfc56051006c6296f29dc4330588755929b320bf04/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e43616368696e672e4561737943616368696e672e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/706c5abc50e8387ecdbb19dfc56051006c6296f29dc4330588755929b320bf04/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e43616368696e672e4561737943616368696e672e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Caching.EasyCaching.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Scheduling\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/3a6254a9a11170b4dfe0f12a6ea360b11b9806b2c09b8f5466a21f91c2ce43f9/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e5363686564756c696e672e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/3a6254a9a11170b4dfe0f12a6ea360b11b9806b2c09b8f5466a21f91c2ce43f9/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e5363686564756c696e672e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Scheduling.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/0c88bd9cfecb065a44a57139da84e78f8a92b63786169d59b06e3e6f6270d0b0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e5363686564756c696e672e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/0c88bd9cfecb065a44a57139da84e78f8a92b63786169d59b06e3e6f6270d0b0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e5363686564756c696e672e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Scheduling.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Scheduling.Quartz\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/0074a0a011506906357fff075f2389fc92203825786e9dc55e63f05df7782667/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e5363686564756c696e672e51756172747a2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/0074a0a011506906357fff075f2389fc92203825786e9dc55e63f05df7782667/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e5363686564756c696e672e51756172747a2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Scheduling.Quartz.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/af8485ddf1c75f683047d939797f769091c5b08af327a41468c33a70c919aa61/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e5363686564756c696e672e51756172747a2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/af8485ddf1c75f683047d939797f769091c5b08af327a41468c33a70c919aa61/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e5363686564756c696e672e51756172747a2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Scheduling.Quartz.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Scheduling.Hangfire\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/249ef0a471fb905311070f3898cfa515d64a621bcd25d21d6758026cce897feb/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e5363686564756c696e672e48616e67666972652e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/249ef0a471fb905311070f3898cfa515d64a621bcd25d21d6758026cce897feb/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e5363686564756c696e672e48616e67666972652e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Scheduling.Hangfire.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/e6198828927e1d90c3a6251aac2673be495d605de13ac9ec0e98fead0bb82421/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e5363686564756c696e672e48616e67666972652e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/e6198828927e1d90c3a6251aac2673be495d605de13ac9ec0e98fead0bb82421/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e5363686564756c696e672e48616e67666972652e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Scheduling.Hangfire.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Images.ImageSharp\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/b54f0323a7f6eecf3f873796bd18a007d6907663992073db1388685d17c94481/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e496d616765732e496d61676553686172702e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/b54f0323a7f6eecf3f873796bd18a007d6907663992073db1388685d17c94481/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e496d616765732e496d61676553686172702e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Images.ImageSharp.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/bc09e39035a7e99ce186718f461995acbcef0d03534bc3a1da92a4a252fd0075/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e496d616765732e496d61676553686172702e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/bc09e39035a7e99ce186718f461995acbcef0d03534bc3a1da92a4a252fd0075/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e496d616765732e496d61676553686172702e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Images.ImageSharp.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Images.Avatar\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/6e7b3cbdc6219202afda1d05b89c8e842f8206602f89bb0f3dff6a2f4f862c69/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e496d616765732e4176617461722e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/6e7b3cbdc6219202afda1d05b89c8e842f8206602f89bb0f3dff6a2f4f862c69/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e496d616765732e4176617461722e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Images.Avatar.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/2c5b881ba8d015c7eb13d3163d19524709c1415e5d99adc6a5def54c5af68a75/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e496d616765732e4176617461722e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/2c5b881ba8d015c7eb13d3163d19524709c1415e5d99adc6a5def54c5af68a75/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e496d616765732e4176617461722e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Images.Avatar.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.FileStorage.Abstractions\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/f339d80af3da0704af8386071bca933b4a578bf5ae6806a6c82850a3229c4074/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e46696c6553746f726167652e4162737472616374696f6e732e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/f339d80af3da0704af8386071bca933b4a578bf5ae6806a6c82850a3229c4074/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e46696c6553746f726167652e4162737472616374696f6e732e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.FileStorage.Abstractions.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/e2cee84c0f0b11f44353e61c27a70f1ac91b60d1f45bfe4ed81eabcf6ccab4f4/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e46696c6553746f726167652e4162737472616374696f6e732e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/e2cee84c0f0b11f44353e61c27a70f1ac91b60d1f45bfe4ed81eabcf6ccab4f4/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e46696c6553746f726167652e4162737472616374696f6e732e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.FileStorage.Abstractions.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.FileStorage\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/5722f854737fd568166e83e2d7e9759dc3e6dc2c8730a3bd33f269d5ab19d52a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e46696c6553746f726167652e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/5722f854737fd568166e83e2d7e9759dc3e6dc2c8730a3bd33f269d5ab19d52a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e46696c6553746f726167652e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.FileStorage.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/8c92f02fde78c1fbb9cd5245dbc4beb4cddec3df400c27eb3d603dc910b0845a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e46696c6553746f726167652e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/8c92f02fde78c1fbb9cd5245dbc4beb4cddec3df400c27eb3d603dc910b0845a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e46696c6553746f726167652e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.FileStorage.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.FileStorage.Minio\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/bc734264ddff1611c2f8ad73c4e6c770012b69f39af3b5e3c28f37fd1f25160a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e46696c6553746f726167652e4d696e696f2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/bc734264ddff1611c2f8ad73c4e6c770012b69f39af3b5e3c28f37fd1f25160a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e46696c6553746f726167652e4d696e696f2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.FileStorage.Minio.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/519e735b2c75971ee648fea0dd3816d9e51829b3e617079d4fd171190709e668/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e46696c6553746f726167652e4d696e696f2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/519e735b2c75971ee648fea0dd3816d9e51829b3e617079d4fd171190709e668/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e46696c6553746f726167652e4d696e696f2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.FileStorage.Minio.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.FileStorage.Aliyun\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/2d6a9c26d152a773d512b10b33d392e2fd7b903541c0c516796d108dfb55884f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e46696c6553746f726167652e416c6979756e2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/2d6a9c26d152a773d512b10b33d392e2fd7b903541c0c516796d108dfb55884f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e46696c6553746f726167652e416c6979756e2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.FileStorage.Aliyun.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/8877e58caad39cb5122dd2c7dc0640115d807a9e71a8e810da6c135e118806b0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e46696c6553746f726167652e416c6979756e2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/8877e58caad39cb5122dd2c7dc0640115d807a9e71a8e810da6c135e118806b0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e46696c6553746f726167652e416c6979756e2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.FileStorage.Aliyun.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.FileStorage.All\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/963198782a823d56ea42b2f1f04bdb5d6d543b4dced671fc840ca0cdaa5d46d8/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e46696c6553746f726167652e416c6c2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/963198782a823d56ea42b2f1f04bdb5d6d543b4dced671fc840ca0cdaa5d46d8/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e46696c6553746f726167652e416c6c2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.FileStorage.All.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/18dcd42f9a6443e3d02fffd335c14fa74a4f31048984582ff7ad1f62e56633db/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e46696c6553746f726167652e416c6c2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/18dcd42f9a6443e3d02fffd335c14fa74a4f31048984582ff7ad1f62e56633db/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e46696c6553746f726167652e416c6c2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.FileStorage.All.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Tenants.Abstractions\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/08c4427d3297cd0122f7063e44dd3c909512bdcd016b44d2af09b0d6c9b76054/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e54656e616e74732e4162737472616374696f6e732e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/08c4427d3297cd0122f7063e44dd3c909512bdcd016b44d2af09b0d6c9b76054/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e54656e616e74732e4162737472616374696f6e732e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Tenants.Abstractions.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/991b8494cf3713019b6cbdb22e61e228a73e72a89c027a3e7ddf08f9cb7eaec9/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e54656e616e74732e4162737472616374696f6e732e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/991b8494cf3713019b6cbdb22e61e228a73e72a89c027a3e7ddf08f9cb7eaec9/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e54656e616e74732e4162737472616374696f6e732e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Tenants.Abstractions.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Tenants\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/5f4fdac9a9555a3f83ab3887ade7fd9650f078a2be2ebfb8b34bf6413f9c484a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e54656e616e74732e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/5f4fdac9a9555a3f83ab3887ade7fd9650f078a2be2ebfb8b34bf6413f9c484a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e54656e616e74732e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Tenants.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/7d8535fe66a92414b9fcaa6ac072aca471851ac5ff9d87474dbd509a5b537c38/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e54656e616e74732e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/7d8535fe66a92414b9fcaa6ac072aca471851ac5ff9d87474dbd509a5b537c38/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e54656e616e74732e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Tenants.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Domain\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/8844480837d8267b58f8d5b610475d918ce97248d7c6c45c8690f084fbc27038/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446f6d61696e2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/8844480837d8267b58f8d5b610475d918ce97248d7c6c45c8690f084fbc27038/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446f6d61696e2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Domain.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/80d0798e1c952ec050650b3a4b3b32b9285cfb3547ab66bee67f42f29c9ae050/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446f6d61696e2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/80d0798e1c952ec050650b3a4b3b32b9285cfb3547ab66bee67f42f29c9ae050/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446f6d61696e2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Domain.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Domain.Biz\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/becf91998bb11c9d6cd00b183cafe58c957f85e173f798475188d0c45b83ac41/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446f6d61696e2e42697a2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/becf91998bb11c9d6cd00b183cafe58c957f85e173f798475188d0c45b83ac41/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446f6d61696e2e42697a2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Domain.Biz.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/16d3bcfae10080cfcb05ad6da39cb65b552db30af511817a42bd9bd71a227c36/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446f6d61696e2e42697a2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/16d3bcfae10080cfcb05ad6da39cb65b552db30af511817a42bd9bd71a227c36/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446f6d61696e2e42697a2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Domain.Biz.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Data.Core\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/1391032ec11feb4e09de0a5df0f203afc629a2a45eb1260884c598b605a478f2/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e436f72652e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/1391032ec11feb4e09de0a5df0f203afc629a2a45eb1260884c598b605a478f2/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e436f72652e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Data.Core.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/cc749c2de2ae2ac6e446e6cde3cf9f4ea54ca6651872161d1572b7b44df89c4d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e436f72652e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/cc749c2de2ae2ac6e446e6cde3cf9f4ea54ca6651872161d1572b7b44df89c4d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e436f72652e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Data.Core.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Data.Sql\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/bf5ad0d744a0c5ccca075238e9b862f258eeef2620b0273dd05f47879d6a0d51/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e53716c2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/bf5ad0d744a0c5ccca075238e9b862f258eeef2620b0273dd05f47879d6a0d51/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e53716c2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Data.Sql.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/1a17cb7701ce23ea04eb30c1735f485acb369351716cabf0f10befc1d352e62f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e53716c2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/1a17cb7701ce23ea04eb30c1735f485acb369351716cabf0f10befc1d352e62f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e53716c2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Data.Sql.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Data.Metadata\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/00d66eaa8c07f739ac8accfd0670bd8206f17968ddfcc76e19e9d642dd9e801c/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4d657461646174612e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/00d66eaa8c07f739ac8accfd0670bd8206f17968ddfcc76e19e9d642dd9e801c/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4d657461646174612e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Data.Metadata.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/eb18973229039c7efdeef3a82df8722af2a583e78ec324aa6d9b49f762f35e45/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4d657461646174612e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/eb18973229039c7efdeef3a82df8722af2a583e78ec324aa6d9b49f762f35e45/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4d657461646174612e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Data.Metadata.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Data.EntityFrameworkCore\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/3e1e877bb8fdb6b929adfcbecd5bdfd4d09c811b50a5f926bfde42254178b00e/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e456e746974794672616d65776f726b436f72652e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/3e1e877bb8fdb6b929adfcbecd5bdfd4d09c811b50a5f926bfde42254178b00e/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e456e746974794672616d65776f726b436f72652e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Data.EntityFrameworkCore.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/624d80e3d13e949e6b023367781abe99d91b0dc4bd4fc649063b6001d7f4d0a2/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e456e746974794672616d65776f726b436f72652e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/624d80e3d13e949e6b023367781abe99d91b0dc4bd4fc649063b6001d7f4d0a2/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e456e746974794672616d65776f726b436f72652e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Data.EntityFrameworkCore.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Data.EntityFrameworkCore.SqlServer\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/a0c9995c20d1364895c2f87ea60806e2d13a0c6de046e06b3e4d27d16fec5384/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e456e746974794672616d65776f726b436f72652e53716c5365727665722e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/a0c9995c20d1364895c2f87ea60806e2d13a0c6de046e06b3e4d27d16fec5384/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e456e746974794672616d65776f726b436f72652e53716c5365727665722e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Data.EntityFrameworkCore.SqlServer.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/5d7843ead98e4accff1a785f088892437baeea9c2d4feea27d45be7ec706a295/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e456e746974794672616d65776f726b436f72652e53716c5365727665722e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/5d7843ead98e4accff1a785f088892437baeea9c2d4feea27d45be7ec706a295/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e456e746974794672616d65776f726b436f72652e53716c5365727665722e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Data.EntityFrameworkCore.SqlServer.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Data.EntityFrameworkCore.PostgreSql\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/71d1a59a3261014751991f9c66ff546a54b9923b5bdd6287e0a82bb354701e9c/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e456e746974794672616d65776f726b436f72652e506f737467726553716c2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/71d1a59a3261014751991f9c66ff546a54b9923b5bdd6287e0a82bb354701e9c/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e456e746974794672616d65776f726b436f72652e506f737467726553716c2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Data.EntityFrameworkCore.PostgreSql.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/d3265ccc8e37e138ac34e87590f2038ffeaa3f3a0b15740528bd0f6101457b3a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e456e746974794672616d65776f726b436f72652e506f737467726553716c2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/d3265ccc8e37e138ac34e87590f2038ffeaa3f3a0b15740528bd0f6101457b3a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e456e746974794672616d65776f726b436f72652e506f737467726553716c2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Data.EntityFrameworkCore.PostgreSql.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Data.EntityFrameworkCore.MySql\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/4bbbb9e76be1b505b340656e3d526bbd18d30e41475516bb73f1a301b671d200/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e456e746974794672616d65776f726b436f72652e4d7953716c2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/4bbbb9e76be1b505b340656e3d526bbd18d30e41475516bb73f1a301b671d200/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e456e746974794672616d65776f726b436f72652e4d7953716c2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Data.EntityFrameworkCore.MySql.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/9cfa161dd100f5b4d590d4655d0bf1a11aaddc242fd956d318be83ce91adce2e/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e456e746974794672616d65776f726b436f72652e4d7953716c2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/9cfa161dd100f5b4d590d4655d0bf1a11aaddc242fd956d318be83ce91adce2e/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e456e746974794672616d65776f726b436f72652e4d7953716c2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Data.EntityFrameworkCore.MySql.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Data.EntityFrameworkCore.Sqlite\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/1acad7ebe8c95fc783e18d0a281cbba8415d5e9c3fd69599f5c608ec9253008b/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e456e746974794672616d65776f726b436f72652e53716c6974652e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/1acad7ebe8c95fc783e18d0a281cbba8415d5e9c3fd69599f5c608ec9253008b/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e456e746974794672616d65776f726b436f72652e53716c6974652e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Data.EntityFrameworkCore.Sqlite.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/4e0759603f7be76ea58263094e715318c6307506853aad9fc73fdbc9f1d9a9e3/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e456e746974794672616d65776f726b436f72652e53716c6974652e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/4e0759603f7be76ea58263094e715318c6307506853aad9fc73fdbc9f1d9a9e3/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e456e746974794672616d65776f726b436f72652e53716c6974652e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Data.EntityFrameworkCore.Sqlite.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Data.EntityFrameworkCore.Oracle\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/d87d1600b1bc5d0551339cdbc86fbc59abd3a79500cd5be4094ad68ee06f7c55/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e456e746974794672616d65776f726b436f72652e4f7261636c652e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/d87d1600b1bc5d0551339cdbc86fbc59abd3a79500cd5be4094ad68ee06f7c55/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e456e746974794672616d65776f726b436f72652e4f7261636c652e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Data.EntityFrameworkCore.Oracle.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/0d3b320e4a4720bbe57d0e9209b013fde6b723f879f12dcc7c34346dfaccf4fa/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e456e746974794672616d65776f726b436f72652e4f7261636c652e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/0d3b320e4a4720bbe57d0e9209b013fde6b723f879f12dcc7c34346dfaccf4fa/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e456e746974794672616d65776f726b436f72652e4f7261636c652e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Data.EntityFrameworkCore.Oracle.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Data.Dapper.Core\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/fc5a255184ac770493ca85deabcaaf0d35349c64fbeb3592371fc5c75dbb1a7e/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4461707065722e436f72652e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/fc5a255184ac770493ca85deabcaaf0d35349c64fbeb3592371fc5c75dbb1a7e/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4461707065722e436f72652e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Data.Dapper.Core.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/d87d5bbe93e679bc6b3f4f8c446f721414303f9a5827bf492576a9cc38c9b49d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4461707065722e436f72652e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/d87d5bbe93e679bc6b3f4f8c446f721414303f9a5827bf492576a9cc38c9b49d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4461707065722e436f72652e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Data.Dapper.Core.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Data.Dapper.SqlServer\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/9b831a40933459092dc8c668e303954567541d2a12f8dabfc522466cb18f05ab/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4461707065722e53716c5365727665722e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/9b831a40933459092dc8c668e303954567541d2a12f8dabfc522466cb18f05ab/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4461707065722e53716c5365727665722e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Data.Dapper.SqlServer.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/cb0795c7a14454c9692bb52d390980a741dfef4b2f338cfb67d2088af08ad901/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4461707065722e53716c5365727665722e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/cb0795c7a14454c9692bb52d390980a741dfef4b2f338cfb67d2088af08ad901/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4461707065722e53716c5365727665722e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Data.Dapper.SqlServer.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Data.Dapper.PostgreSql\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/26462b0f79904b4eb0cfe2e19d6994e06b562872a608705dfa887f2f7799972f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4461707065722e506f737467726553716c2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/26462b0f79904b4eb0cfe2e19d6994e06b562872a608705dfa887f2f7799972f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4461707065722e506f737467726553716c2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Data.Dapper.PostgreSql.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/cbe648061306831c9f38ebde59d12e77be049d634ab671266513b533efc3b002/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4461707065722e506f737467726553716c2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/cbe648061306831c9f38ebde59d12e77be049d634ab671266513b533efc3b002/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4461707065722e506f737467726553716c2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Data.Dapper.PostgreSql.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Data.Dapper.MySql\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/aa259427f2de54316b6fad5b5ba7b08f7324b5e65ad89b085df8b56b4325ee5d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4461707065722e4d7953716c2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/aa259427f2de54316b6fad5b5ba7b08f7324b5e65ad89b085df8b56b4325ee5d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4461707065722e4d7953716c2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Data.Dapper.MySql.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/3858b905dc99e4700c7127fb97f61c8dd00888ffd0fcad389c2663cc70d8e468/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4461707065722e4d7953716c2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/3858b905dc99e4700c7127fb97f61c8dd00888ffd0fcad389c2663cc70d8e468/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4461707065722e4d7953716c2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Data.Dapper.MySql.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Data.Dapper.All\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/f8ecf9613b326d245518e5396678c4b7334b4f2bda861e44a7dd9679209b877c/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4461707065722e416c6c2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/f8ecf9613b326d245518e5396678c4b7334b4f2bda861e44a7dd9679209b877c/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4461707065722e416c6c2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Data.Dapper.All.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/b87a1bb404cb78e6084e4f77387a970758e067b55925178017313cb2d9d8081a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4461707065722e416c6c2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/b87a1bb404cb78e6084e4f77387a970758e067b55925178017313cb2d9d8081a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4461707065722e416c6c2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Data.Dapper.All.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Application\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/a46bd2bda8f22e14ec1625c680a29da3ad77a7c16f8c46f31c711f92263e277a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4170706c69636174696f6e2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/a46bd2bda8f22e14ec1625c680a29da3ad77a7c16f8c46f31c711f92263e277a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4170706c69636174696f6e2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Application.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/af357fb1d4063a82c09171d285d16a513f39fd14ec43f265a2250eab1e1a8797/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4170706c69636174696f6e2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/af357fb1d4063a82c09171d285d16a513f39fd14ec43f265a2250eab1e1a8797/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4170706c69636174696f6e2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Application.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Application.EntityFrameworkCore\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/56fea58295ee8643400b6804c265af0b06451b2c50c3e47ce720dfff9160dcd0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4170706c69636174696f6e2e456e746974794672616d65776f726b436f72652e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/56fea58295ee8643400b6804c265af0b06451b2c50c3e47ce720dfff9160dcd0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4170706c69636174696f6e2e456e746974794672616d65776f726b436f72652e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Application.EntityFrameworkCore.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/debb22e6d74562d541eb98cb7087f16bb30d678d3dbc8e513e74f35b9b804025/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4170706c69636174696f6e2e456e746974794672616d65776f726b436f72652e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/debb22e6d74562d541eb98cb7087f16bb30d678d3dbc8e513e74f35b9b804025/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4170706c69636174696f6e2e456e746974794672616d65776f726b436f72652e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Application.EntityFrameworkCore.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Application.WebApi\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/10aadb0ce9c9f1cfc06bc5ada37d12c5efcec14b93f515113cc373555342c597/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4170706c69636174696f6e2e5765624170692e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/10aadb0ce9c9f1cfc06bc5ada37d12c5efcec14b93f515113cc373555342c597/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4170706c69636174696f6e2e5765624170692e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Application.WebApi.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/b2c52d4b958ec3d4cc983707ca47c21cdbd4357739fff2df3bb3d46bd2eda0ac/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4170706c69636174696f6e2e5765624170692e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/b2c52d4b958ec3d4cc983707ca47c21cdbd4357739fff2df3bb3d46bd2eda0ac/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4170706c69636174696f6e2e5765624170692e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Application.WebApi.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Microservices\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/6a18c4b00982d65b919f1db70d32c46666998c98c5e6d41613d6507b725586f5/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4d6963726f73657276696365732e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/6a18c4b00982d65b919f1db70d32c46666998c98c5e6d41613d6507b725586f5/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4d6963726f73657276696365732e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Microservices.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/097c4641e277828d8bbed828b8b9e08658fdc51c2b2a139709f059ca0d35a843/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4d6963726f73657276696365732e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/097c4641e277828d8bbed828b8b9e08658fdc51c2b2a139709f059ca0d35a843/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4d6963726f73657276696365732e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Microservices.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Microservices.Polly\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/a9ab5d21f9a34acdc7885e0a0eadacb7f237d82b529a6d0ed2e5fa79fc53838d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4d6963726f73657276696365732e506f6c6c792e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/a9ab5d21f9a34acdc7885e0a0eadacb7f237d82b529a6d0ed2e5fa79fc53838d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4d6963726f73657276696365732e506f6c6c792e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Microservices.Polly.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/57e263d3ea9f87792d0eedafc6658bb89377f806bed89a00109e069eddbaaf8b/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4d6963726f73657276696365732e506f6c6c792e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/57e263d3ea9f87792d0eedafc6658bb89377f806bed89a00109e069eddbaaf8b/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4d6963726f73657276696365732e506f6c6c792e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Microservices.Polly.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Microservices.Dapr\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/978342916aa7f2c2eaa055af1e9227c82551434fadf080fe5ee3da6e856078d9/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4d6963726f73657276696365732e446170722e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/978342916aa7f2c2eaa055af1e9227c82551434fadf080fe5ee3da6e856078d9/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4d6963726f73657276696365732e446170722e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Microservices.Dapr.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/7bb2060c616d0f5f48f0860f167b01522bed2b60a5746e5358d1957ee85a337c/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4d6963726f73657276696365732e446170722e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/7bb2060c616d0f5f48f0860f167b01522bed2b60a5746e5358d1957ee85a337c/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4d6963726f73657276696365732e446170722e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Microservices.Dapr.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Microservices.HealthChecks\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/54794a7a0299fde233b449247b1f88773d587ccb35b828a4e5af9e328b4e13b9/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4d6963726f73657276696365732e4865616c7468436865636b732e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/54794a7a0299fde233b449247b1f88773d587ccb35b828a4e5af9e328b4e13b9/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4d6963726f73657276696365732e4865616c7468436865636b732e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Microservices.HealthChecks.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/ccd658e55cf13e5292fb31d4897863cc5ed10c577e38b58acbb9714db02e2f53/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4d6963726f73657276696365732e4865616c7468436865636b732e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/ccd658e55cf13e5292fb31d4897863cc5ed10c577e38b58acbb9714db02e2f53/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4d6963726f73657276696365732e4865616c7468436865636b732e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Microservices.HealthChecks.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Ui\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/49d06d019e683f7dbc829d138ffd44bf170072049719d00b9fce762ca98e481b/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e55692e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/49d06d019e683f7dbc829d138ffd44bf170072049719d00b9fce762ca98e481b/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e55692e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Ui.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/174d11d8267da7d09dfc2bf7ecd6e257ebaf0cf1751824dda0f65569cbc6b881/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e55692e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/174d11d8267da7d09dfc2bf7ecd6e257ebaf0cf1751824dda0f65569cbc6b881/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e55692e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Ui.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Ui.Angular\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/4e9815cb6c1b7fd309b62ba33b202bf503b5de4672c4266d4f7f09e382c2d537/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e55692e416e67756c61722e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/4e9815cb6c1b7fd309b62ba33b202bf503b5de4672c4266d4f7f09e382c2d537/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e55692e416e67756c61722e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Ui.Angular.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/6f5318f4318b051f767d2aba4f40bf90bf24915bf96751d768fad907e304a77c/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e55692e416e67756c61722e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/6f5318f4318b051f767d2aba4f40bf90bf24915bf96751d768fad907e304a77c/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e55692e416e67756c61722e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Ui.Angular.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Ui.NgZorro\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/5dbcc37599a8a4adae215a47dc3b6fca60744b96d19dcc0707a255f636c6f512/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e55692e4e675a6f72726f2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/5dbcc37599a8a4adae215a47dc3b6fca60744b96d19dcc0707a255f636c6f512/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e55692e4e675a6f72726f2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Ui.NgZorro.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/05fc2239ae047222d2b502e6eeb0a4edb814d13cd7f1a2bcc76debe717c74196/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e55692e4e675a6f72726f2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/05fc2239ae047222d2b502e6eeb0a4edb814d13cd7f1a2bcc76debe717c74196/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e55692e4e675a6f72726f2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Ui.NgZorro.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Ui.NgAlain\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/850d2c1ac72983ba6e675857a34f57add04f09681460d7842d4239bb2590a233/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e55692e4e67416c61696e2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/850d2c1ac72983ba6e675857a34f57add04f09681460d7842d4239bb2590a233/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e55692e4e67416c61696e2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Ui.NgAlain.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/cb27c30342c780dd76ae8dd9333e75217e7b07a5ff32e49683d21ec801eb3a9f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e55692e4e67416c61696e2e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/cb27c30342c780dd76ae8dd9333e75217e7b07a5ff32e49683d21ec801eb3a9f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e55692e4e67416c61696e2e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Ui.NgAlain.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Generators\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/d851b07415c181795c17f503a771c2c00de93d5adf3cbf4476277204b18f67ca/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e47656e657261746f72732e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/d851b07415c181795c17f503a771c2c00de93d5adf3cbf4476277204b18f67ca/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e47656e657261746f72732e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Generators.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/b7e6c019c99cfc835cd29b3cd2b92e0fe55a401c780c48d082b33ea1c14638d3/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e47656e657261746f72732e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/b7e6c019c99cfc835cd29b3cd2b92e0fe55a401c780c48d082b33ea1c14638d3/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e47656e657261746f72732e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Generators.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eUtil.Generators.Razor\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/920768f38525da52573cff92917122c88b7efa01cc99041a403af74bc6d33143/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e47656e657261746f72732e52617a6f722e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/920768f38525da52573cff92917122c88b7efa01cc99041a403af74bc6d33143/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e47656e657261746f72732e52617a6f722e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/v/Util.Generators.Razor.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/c1ae6afee849a5fe942a70f36bedb4f3c62452d969b38e4e6e5b74e076e81cdb/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e47656e657261746f72732e52617a6f722e737667\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/c1ae6afee849a5fe942a70f36bedb4f3c62452d969b38e4e6e5b74e076e81cdb/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e47656e657261746f72732e52617a6f722e737667\" alt=\"\" data-canonical-src=\"https://img.shields.io/nuget/dt/Util.Generators.Razor.svg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eNpm包\u003c/h3\u003e\u003ca id=\"user-content-npm包\" class=\"anchor\" aria-label=\"Permalink: Npm包\" href=\"#npm包\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003cstrong\u003eutil-angular\u003c/strong\u003e\n\u003ca href=\"https://www.npmjs.org/package/util-angular\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/f67fa6889a48a05ba3d01b9b8a4432cdd7a3c6e397fc04861e2966f6255be723/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f7574696c2d616e67756c61722e7376673f7374796c653d666c61742d737175617265\" alt=\"npm package\" data-canonical-src=\"https://img.shields.io/npm/v/util-angular.svg?style=flat-square\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\n\u003ca href=\"https://npmjs.org/package/util-angular\" rel=\"nofollow\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/f0362e9b80da463e45b53310b159be0482050c242fd245faa5bc8cb4444be37b/687474703a2f2f696d672e736869656c64732e696f2f6e706d2f646d2f7574696c2d616e67756c61722e7376673f7374796c653d666c61742d737175617265\" alt=\"NPM downloads\" data-canonical-src=\"http://img.shields.io/npm/dm/util-angular.svg?style=flat-square\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003c/article\u003e","loaded":true,"timedOut":false,"errorMessage":null,"headerInfo":{"toc":[{"level":1,"text":"Util应用框架介绍","anchor":"util应用框架介绍","htmlText":"Util应用框架介绍"},{"level":2,"text":"什么是Util应用框架?","anchor":"什么是util应用框架","htmlText":"什么是Util应用框架?"},{"level":2,"text":"Util应用框架的作者: 何镇汐","anchor":"util应用框架的作者-何镇汐","htmlText":"Util应用框架的作者: 何镇汐"},{"level":2,"text":"Util应用框架的开源协议: MIT","anchor":"util应用框架的开源协议-mit","htmlText":"Util应用框架的开源协议: MIT"},{"level":2,"text":"Util应用框架的主要贡献者","anchor":"util应用框架的主要贡献者","htmlText":"Util应用框架的主要贡献者"},{"level":2,"text":"Util应用框架的目标: 让开发更简单","anchor":"util应用框架的目标-让开发更简单","htmlText":"Util应用框架的目标: 让开发更简单"},{"level":2,"text":"Util应用框架的特点: 简单易用","anchor":"util应用框架的特点-简单易用","htmlText":"Util应用框架的特点: 简单易用"},{"level":2,"text":"Util应用框架开发流程","anchor":"util应用框架开发流程","htmlText":"Util应用框架开发流程"},{"level":2,"text":"Util应用框架的使用方式","anchor":"util应用框架的使用方式","htmlText":"Util应用框架的使用方式"},{"level":2,"text":"框架核心","anchor":"框架核心","htmlText":"框架核心"},{"level":3,"text":"启动器","anchor":"启动器","htmlText":"启动器"},{"level":3,"text":"服务注册器","anchor":"服务注册器","htmlText":"服务注册器"},{"level":3,"text":"依赖注册器","anchor":"依赖注册器","htmlText":"依赖注册器"},{"level":2,"text":"框架基础","anchor":"框架基础","htmlText":"框架基础"},{"level":3,"text":"对象到对象映射","anchor":"对象到对象映射","htmlText":"对象到对象映射"},{"level":3,"text":"AOP( 面向切面编程 )","anchor":"aop-面向切面编程-","htmlText":"AOP( 面向切面编程 )"},{"level":3,"text":"对象验证","anchor":"对象验证","htmlText":"对象验证"},{"level":3,"text":"异常处理","anchor":"异常处理","htmlText":"异常处理"},{"level":3,"text":"身份认证和授权","anchor":"身份认证和授权","htmlText":"身份认证和授权"},{"level":3,"text":"本地化","anchor":"本地化","htmlText":"本地化"},{"level":3,"text":"日志","anchor":"日志","htmlText":"日志"},{"level":3,"text":"缓存","anchor":"缓存","htmlText":"缓存"},{"level":3,"text":"事件总线","anchor":"事件总线","htmlText":"事件总线"},{"level":3,"text":"模板引擎","anchor":"模板引擎","htmlText":"模板引擎"},{"level":3,"text":"图像处理","anchor":"图像处理","htmlText":"图像处理"},{"level":3,"text":"文件存储","anchor":"文件存储","htmlText":"文件存储"},{"level":3,"text":"后台任务","anchor":"后台任务","htmlText":"后台任务"},{"level":3,"text":"数据访问","anchor":"数据访问","htmlText":"数据访问"},{"level":3,"text":"工具类","anchor":"工具类","htmlText":"工具类"},{"level":2,"text":"架构支持","anchor":"架构支持","htmlText":"架构支持"},{"level":3,"text":"多租户架构支持","anchor":"多租户架构支持","htmlText":"多租户架构支持"},{"level":3,"text":"DDD分层架构支持","anchor":"ddd分层架构支持","htmlText":"DDD分层架构支持"},{"level":4,"text":"领域层","anchor":"领域层","htmlText":"领域层"},{"level":5,"text":"聚合根","anchor":"聚合根","htmlText":"聚合根"},{"level":5,"text":"实体","anchor":"实体","htmlText":"实体"},{"level":5,"text":"值对象","anchor":"值对象","htmlText":"值对象"},{"level":5,"text":"仓储","anchor":"仓储","htmlText":"仓储"},{"level":5,"text":"领域服务","anchor":"领域服务","htmlText":"领域服务"},{"level":5,"text":"领域事件","anchor":"领域事件","htmlText":"领域事件"},{"level":4,"text":"基础设施层","anchor":"基础设施层","htmlText":"基础设施层"},{"level":4,"text":"应用层","anchor":"应用层","htmlText":"应用层"},{"level":5,"text":"应用服务","anchor":"应用服务","htmlText":"应用服务"},{"level":5,"text":"数据传输对象(DTO)","anchor":"数据传输对象dto","htmlText":"数据传输对象(DTO)"},{"level":5,"text":"查询参数对象","anchor":"查询参数对象","htmlText":"查询参数对象"},{"level":4,"text":"表现层","anchor":"表现层","htmlText":"表现层"},{"level":3,"text":"微服务架构支持","anchor":"微服务架构支持","htmlText":"微服务架构支持"},{"level":3,"text":"常见业务功能支持","anchor":"常见业务功能支持","htmlText":"常见业务功能支持"},{"level":4,"text":"树形结构支持","anchor":"树形结构支持","htmlText":"树形结构支持"},{"level":4,"text":"审计支持","anchor":"审计支持","htmlText":"审计支持"},{"level":4,"text":"逻辑删除支持","anchor":"逻辑删除支持","htmlText":"逻辑删除支持"},{"level":4,"text":"对象变更值支持","anchor":"对象变更值支持","htmlText":"对象变更值支持"},{"level":2,"text":"代码生成","anchor":"代码生成","htmlText":"代码生成"},{"level":2,"text":"UI 技术选型","anchor":"ui-技术选型","htmlText":"UI 技术选型"},{"level":3,"text":"Js语言","anchor":"js语言","htmlText":"Js语言"},{"level":4,"text":"TypeScript","anchor":"typescript","htmlText":"TypeScript"},{"level":3,"text":"Js框架","anchor":"js框架","htmlText":"Js框架"},{"level":4,"text":"Angular","anchor":"angular","htmlText":"Angular"},{"level":3,"text":"Angular 组件库","anchor":"angular-组件库","htmlText":"Angular 组件库"},{"level":4,"text":"Ng Zorro","anchor":"ng-zorro","htmlText":"Ng Zorro"},{"level":4,"text":"Ng Alain","anchor":"ng-alain","htmlText":"Ng Alain"},{"level":3,"text":"Angular 微前端框架","anchor":"angular-微前端框架","htmlText":"Angular 微前端框架"},{"level":4,"text":"Angular Module Federation","anchor":"angular-module-federation","htmlText":"Angular Module Federation"},{"level":2,"text":"Util Angular UI 特点","anchor":"util-angular-ui-特点","htmlText":"Util Angular UI 特点"},{"level":3,"text":"组件扩展支持","anchor":"组件扩展支持","htmlText":"组件扩展支持"},{"level":3,"text":"Razor TagHelper 支持","anchor":"razor-taghelper-支持","htmlText":"Razor TagHelper 支持"},{"level":3,"text":"前后分离","anchor":"前后分离","htmlText":"前后分离"},{"level":3,"text":"配套Api支持","anchor":"配套api支持","htmlText":"配套Api支持"},{"level":3,"text":"本地化支持","anchor":"本地化支持","htmlText":"本地化支持"},{"level":3,"text":"授权访问支持","anchor":"授权访问支持","htmlText":"授权访问支持"},{"level":3,"text":"微前端支持","anchor":"微前端支持","htmlText":"微前端支持"},{"level":2,"text":"Util Angular UI 功能列表","anchor":"util-angular-ui-功能列表","htmlText":"Util Angular UI 功能列表"},{"level":3,"text":"util-angular 功能列表","anchor":"util-angular-功能列表","htmlText":"util-angular 功能列表"},{"level":4,"text":"基础类型","anchor":"基础类型","htmlText":"基础类型"},{"level":4,"text":"工具类","anchor":"工具类-1","htmlText":"工具类"},{"level":4,"text":"Crud组件基类","anchor":"crud组件基类","htmlText":"Crud组件基类"},{"level":4,"text":"Ng Zorro指令扩展","anchor":"ng-zorro指令扩展","htmlText":"Ng Zorro指令扩展"},{"level":3,"text":"Util.Ui.NgZorro 库介绍","anchor":"utiluingzorro-库介绍","htmlText":"Util.Ui.NgZorro 库介绍"},{"level":2,"text":"Util Angular UI 已知缺陷","anchor":"util-angular-ui-已知缺陷","htmlText":"Util Angular UI 已知缺陷"},{"level":2,"text":"Util Angular UI 适合你吗?","anchor":"util-angular-ui-适合你吗","htmlText":"Util Angular UI 适合你吗?"},{"level":2,"text":"参考应用框架","anchor":"参考应用框架","htmlText":"参考应用框架"},{"level":2,"text":"Util应用框架相关资源","anchor":"util应用框架相关资源","htmlText":"Util应用框架相关资源"},{"level":3,"text":"Util教程目录","anchor":"util教程目录","htmlText":"Util教程目录"},{"level":3,"text":"Github项目地址","anchor":"github项目地址","htmlText":"Github项目地址"},{"level":3,"text":"Gitee项目地址","anchor":"gitee项目地址","htmlText":"Gitee项目地址"},{"level":3,"text":"Nuget包","anchor":"nuget包","htmlText":"Nuget包"},{"level":3,"text":"Npm包","anchor":"npm包","htmlText":"Npm包"}],"siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fdotnetcore%2FUtil"}},{"displayName":"LICENSE.txt","repoName":"Util","refName":"master","path":"LICENSE.txt","preferredFileType":"license","tabName":"MIT","richText":null,"loaded":false,"timedOut":false,"errorMessage":null,"headerInfo":{"toc":null,"siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fdotnetcore%2FUtil"}}],"overviewFilesProcessingTime":0}},"appPayload":{"helpUrl":"https://docs.github.com","findFileWorkerPath":"/assets-cdn/worker/find-file-worker-7d7eb7c71814.js","findInFileWorkerPath":"/assets-cdn/worker/find-in-file-worker-708ec8ade250.js","githubDevUrl":null,"enabled_features":{"copilot_workspace":null,"code_nav_ui_events":false,"overview_shared_code_dropdown_button":true,"react_blob_overlay":false,"accessible_code_button":true,"github_models_repo_integration":false}}}}</script> <div data-target="react-partial.reactRoot"><style data-styled="true" data-styled-version="5.3.11">.iVEunk{margin-top:16px;margin-bottom:16px;}/*!sc*/ .jzuOtQ{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}/*!sc*/ .bGojzy{margin-bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;row-gap:16px;}/*!sc*/ .iNSVHo{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding-bottom:16px;padding-top:8px;}/*!sc*/ .bVgnfw{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;gap:8px;}/*!sc*/ @media screen and (max-width:320px){.bVgnfw{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}}/*!sc*/ .CEgMp{position:relative;}/*!sc*/ @media screen and (max-width:380px){.CEgMp .ref-selector-button-text-container{max-width:80px;}}/*!sc*/ @media screen and (max-width:320px){.CEgMp{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}.CEgMp .overview-ref-selector{width:100%;}.CEgMp .overview-ref-selector > span{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;}.CEgMp .overview-ref-selector > span > span[data-component="text"]{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}}/*!sc*/ .gMOVLe[data-size="medium"]{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:0;}/*!sc*/ .gMOVLe[data-size="medium"] svg{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .gMOVLe[data-size="medium"] > span{width:inherit;}/*!sc*/ .gUkoLg{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}/*!sc*/ .bZBlpz{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;}/*!sc*/ .lhTYNA{margin-right:4px;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .ffLUq{font-size:14px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}/*!sc*/ .bmcJak{min-width:0;}/*!sc*/ .fLXEGX{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (max-width:1079px){.fLXEGX{display:none;}}/*!sc*/ .lmSMZJ[data-size="medium"]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));padding-left:4px;padding-right:4px;}/*!sc*/ .lmSMZJ[data-size="medium"] span[data-component="leadingVisual"]{margin-right:4px !important;}/*!sc*/ .dqfxud{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (min-width:1080px){.dqfxud{display:none;}}/*!sc*/ @media screen and (max-width:543px){.dqfxud{display:none;}}/*!sc*/ .fGwBZA[data-size="medium"][data-no-visuals]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .jxTzTd{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:8px;gap:8px;}/*!sc*/ .gqqBXN{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:8px;}/*!sc*/ @media screen and (max-width:543px){.gqqBXN{display:none;}}/*!sc*/ .dzXgxt{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (max-width:1011px){.dzXgxt{display:none;}}/*!sc*/ .iWFGlI{margin-left:8px;margin-right:8px;margin:0;}/*!sc*/ .vcvyP{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:160px;}/*!sc*/ .YUPas{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (min-width:1012px){.YUPas{display:none;}}/*!sc*/ .izFOf{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (min-width:544px){.izFOf{display:none;}}/*!sc*/ .vIPPs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;gap:16px;}/*!sc*/ .fdROMU{width:100%;border-collapse:separate;border-spacing:0;border:1px solid;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));border-radius:6px;table-layout:fixed;overflow:unset;}/*!sc*/ .jGKpsv{height:0px;line-height:0px;}/*!sc*/ .jGKpsv tr{height:0px;font-size:0px;}/*!sc*/ .jdgHnn{padding:16px;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));font-size:12px;text-align:left;height:40px;}/*!sc*/ .jdgHnn th{padding-left:16px;background-color:var(--bgColor-muted,var(--color-canvas-subtle,#f6f8fa));}/*!sc*/ .bQivRW{width:100%;border-top-left-radius:6px;}/*!sc*/ @media screen and (min-width:544px){.bQivRW{display:none;}}/*!sc*/ .ldkMIO{width:40%;border-top-left-radius:6px;}/*!sc*/ @media screen and (max-width:543px){.ldkMIO{display:none;}}/*!sc*/ .jMbWeI{text-align:right;padding-right:16px;width:136px;border-top-right-radius:6px;}/*!sc*/ .gpqjiB{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));font-size:12px;height:40px;}/*!sc*/ .dzCJzi{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;min-width:273px;padding:8px;}/*!sc*/ @media screen and (min-width:544px){.dzCJzi{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;}}/*!sc*/ .eNCcrz{text-align:center;vertical-align:center;height:40px;border-top:1px solid;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));}/*!sc*/ .bHTcCe{border-top:1px solid var(--borderColor-default,var(--color-border-default));cursor:pointer;}/*!sc*/ .csrIcr{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;gap:16px;}/*!sc*/ .bUQNHB{border:1px solid;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));border-radius:6px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}/*!sc*/ @media screen and (max-width:543px){.bUQNHB{margin-left:-16px;margin-right:-16px;max-width:calc(100% + 32px);}}/*!sc*/ @media screen and (min-width:544px){.bUQNHB{max-width:100%;}}/*!sc*/ .jPdcfu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-bottom:1px solid;border-bottom-color:var(--borderColor-default,var(--color-border-default,#d0d7de));-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-right:8px;position:-webkit-sticky;position:sticky;top:0;background-color:var(--bgColor-default,var(--color-canvas-default,#ffffff));z-index:1;border-top-left-radius:6px;border-top-right-radius:6px;}/*!sc*/ .iphEWz{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;border-bottom:none;max-width:100%;padding-left:8px;padding-right:8px;}/*!sc*/ .hUCRAk{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .cwoBXV[data-size="medium"]{color:var(--fgColor-muted,var(--color-fg-subtle,#6e7781));padding-left:8px;padding-right:8px;}/*!sc*/ .QkQOb{padding:32px;overflow:auto;}/*!sc*/ data-styled.g1[id="Box-sc-g0xbh4-0"]{content:"iVEunk,jzuOtQ,bGojzy,iNSVHo,bVgnfw,CEgMp,gMOVLe,gUkoLg,bZBlpz,lhTYNA,ffLUq,bmcJak,fLXEGX,lmSMZJ,dqfxud,fGwBZA,jxTzTd,gqqBXN,dzXgxt,iWFGlI,vcvyP,YUPas,izFOf,vIPPs,fdROMU,jGKpsv,jdgHnn,bQivRW,ldkMIO,jMbWeI,gpqjiB,dzCJzi,eNCcrz,bHTcCe,csrIcr,bUQNHB,jPdcfu,iphEWz,hUCRAk,cwoBXV,QkQOb,"}/*!sc*/ .brGdpi{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;-webkit-clip:rect(0,0,0,0);clip:rect(0,0,0,0);white-space:nowrap;border-width:0;}/*!sc*/ data-styled.g5[id="_VisuallyHidden__VisuallyHidden-sc-11jhm7a-0"]{content:"brGdpi,"}/*!sc*/ .hWlpPn{position:relative;display:inline-block;}/*!sc*/ .hWlpPn::after{position:absolute;z-index:1000000;display:none;padding:0.5em 0.75em;font:normal normal 11px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-font-smoothing:subpixel-antialiased;color:var(--tooltip-fgColor,var(--fgColor-onEmphasis,var(--color-fg-on-emphasis,#ffffff)));text-align:center;-webkit-text-decoration:none;text-decoration:none;text-shadow:none;text-transform:none;-webkit-letter-spacing:normal;-moz-letter-spacing:normal;-ms-letter-spacing:normal;letter-spacing:normal;word-wrap:break-word;white-space:pre;pointer-events:none;content:attr(aria-label);background:var(--tooltip-bgColor,var(--bgColor-emphasis,var(--color-neutral-emphasis-plus,#24292f)));border-radius:6px;opacity:0;}/*!sc*/ @-webkit-keyframes tooltip-appear{from{opacity:0;}to{opacity:1;}}/*!sc*/ @keyframes tooltip-appear{from{opacity:0;}to{opacity:1;}}/*!sc*/ .hWlpPn:hover::after,.hWlpPn:active::after,.hWlpPn:focus::after,.hWlpPn:focus-within::after{display:inline-block;-webkit-text-decoration:none;text-decoration:none;-webkit-animation-name:tooltip-appear;animation-name:tooltip-appear;-webkit-animation-duration:0.1s;animation-duration:0.1s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;-webkit-animation-delay:0s;animation-delay:0s;}/*!sc*/ .hWlpPn.tooltipped-no-delay:hover::after,.hWlpPn.tooltipped-no-delay:active::after,.hWlpPn.tooltipped-no-delay:focus::after,.hWlpPn.tooltipped-no-delay:focus-within::after{-webkit-animation-delay:0s;animation-delay:0s;}/*!sc*/ .hWlpPn.tooltipped-multiline:hover::after,.hWlpPn.tooltipped-multiline:active::after,.hWlpPn.tooltipped-multiline:focus::after,.hWlpPn.tooltipped-multiline:focus-within::after{display:table-cell;}/*!sc*/ .hWlpPn.tooltipped-s::after,.hWlpPn.tooltipped-se::after,.hWlpPn.tooltipped-sw::after{top:100%;right:50%;margin-top:6px;}/*!sc*/ .hWlpPn.tooltipped-se::after{right:auto;left:50%;margin-left:-16px;}/*!sc*/ .hWlpPn.tooltipped-sw::after{margin-right:-16px;}/*!sc*/ .hWlpPn.tooltipped-n::after,.hWlpPn.tooltipped-ne::after,.hWlpPn.tooltipped-nw::after{right:50%;bottom:100%;margin-bottom:6px;}/*!sc*/ .hWlpPn.tooltipped-ne::after{right:auto;left:50%;margin-left:-16px;}/*!sc*/ .hWlpPn.tooltipped-nw::after{margin-right:-16px;}/*!sc*/ .hWlpPn.tooltipped-s::after,.hWlpPn.tooltipped-n::after{-webkit-transform:translateX(50%);-ms-transform:translateX(50%);transform:translateX(50%);}/*!sc*/ .hWlpPn.tooltipped-w::after{right:100%;bottom:50%;margin-right:6px;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);}/*!sc*/ .hWlpPn.tooltipped-e::after{bottom:50%;left:100%;margin-left:6px;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);}/*!sc*/ .hWlpPn.tooltipped-multiline::after{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:250px;word-wrap:break-word;white-space:pre-line;border-collapse:separate;}/*!sc*/ .hWlpPn.tooltipped-multiline.tooltipped-s::after,.hWlpPn.tooltipped-multiline.tooltipped-n::after{right:auto;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);}/*!sc*/ .hWlpPn.tooltipped-multiline.tooltipped-w::after,.hWlpPn.tooltipped-multiline.tooltipped-e::after{right:100%;}/*!sc*/ .hWlpPn.tooltipped-align-right-2::after{right:0;margin-right:0;}/*!sc*/ .hWlpPn.tooltipped-align-left-2::after{left:0;margin-left:0;}/*!sc*/ data-styled.g16[id="Tooltip__TooltipBase-sc-17tf59c-0"]{content:"hWlpPn,"}/*!sc*/ .liVpTx{display:inline-block;overflow:hidden;text-overflow:ellipsis;vertical-align:top;white-space:nowrap;max-width:125px;}/*!sc*/ data-styled.g18[id="Truncate__StyledTruncate-sc-23o1d2-0"]{content:"liVpTx,"}/*!sc*/ </style> <!-- --> <!-- --> <div class="Box-sc-g0xbh4-0 iVEunk"><div class="Box-sc-g0xbh4-0 jzuOtQ"><div class="Box-sc-g0xbh4-0 bGojzy"></div></div><div class="Box-sc-g0xbh4-0 iNSVHo"><div class="Box-sc-g0xbh4-0 bVgnfw"><div class="Box-sc-g0xbh4-0 CEgMp"><button type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="master branch" data-testid="anchor-button" class="Box-sc-g0xbh4-0 gMOVLe prc-Button-ButtonBase-c50BI overview-ref-selector width-full" data-loading="false" data-size="medium" data-variant="default" aria-describedby="branch-picker-repos-header-ref-selector-loading-announcement" id="branch-picker-repos-header-ref-selector"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg prc-Button-ButtonContent-HKbr-"><span data-component="text" class="prc-Button-Label-pTQ3x"><div class="Box-sc-g0xbh4-0 bZBlpz"><div class="Box-sc-g0xbh4-0 lhTYNA"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></div><div class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"><span class="Box-sc-g0xbh4-0 bmcJak prc-Text-Text-0ima0"> <!-- -->master</span></div></div></span><span data-component="trailingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><button hidden="" data-hotkey-scope="read-only-cursor-text-area"></button></div><div class="Box-sc-g0xbh4-0 fLXEGX"><a style="--button-color:fg.muted" type="button" href="/dotnetcore/Util/branches" class="Box-sc-g0xbh4-0 lmSMZJ prc-Button-ButtonBase-c50BI" data-loading="false" data-size="medium" data-variant="invisible" aria-describedby=":Rclab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></span><span data-component="text" class="prc-Button-Label-pTQ3x">Branches</span></span></a><a style="--button-color:fg.muted" type="button" href="/dotnetcore/Util/tags" class="Box-sc-g0xbh4-0 lmSMZJ prc-Button-ButtonBase-c50BI" data-loading="false" data-size="medium" data-variant="invisible" aria-describedby=":Rklab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-tag" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path></svg></span><span data-component="text" class="prc-Button-Label-pTQ3x">Tags</span></span></a></div><div class="Box-sc-g0xbh4-0 dqfxud"><a style="--button-color:fg.muted" type="button" aria-label="Go to Branches page" href="/dotnetcore/Util/branches" class="Box-sc-g0xbh4-0 fGwBZA prc-Button-ButtonBase-c50BI" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-describedby=":Relab:-loading-announcement"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></a><a style="--button-color:fg.muted" type="button" aria-label="Go to Tags page" href="/dotnetcore/Util/tags" class="Box-sc-g0xbh4-0 fGwBZA prc-Button-ButtonBase-c50BI" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="invisible" aria-describedby=":Rmlab:-loading-announcement"><svg aria-hidden="true" focusable="false" class="octicon octicon-tag" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path></svg></a></div></div><div class="Box-sc-g0xbh4-0 jxTzTd"><div class="Box-sc-g0xbh4-0 gqqBXN"><div class="Box-sc-g0xbh4-0 dzXgxt"><!--$--><div class="Box-sc-g0xbh4-0 iWFGlI"><span class="Box-sc-g0xbh4-0 vcvyP TextInput-wrapper prc-components-TextInputWrapper-i1ofR prc-components-TextInputBaseWrapper-ueK9q" data-leading-visual="true" data-trailing-visual="true" aria-busy="false"><span class="TextInput-icon" id=":R2j5ab:" aria-hidden="true"><svg aria-hidden="true" focusable="false" class="octicon octicon-search" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg></span><input type="text" aria-label="Go to file" role="combobox" aria-controls="file-results-list" aria-expanded="false" aria-haspopup="dialog" autoCorrect="off" spellcheck="false" placeholder="Go to file" aria-describedby=":R2j5ab: :R2j5abH1:" data-component="input" class="prc-components-Input-Ic-y8" value=""/><span class="TextInput-icon" id=":R2j5abH1:" aria-hidden="true"></span></span></div><!--/$--></div><div class="Box-sc-g0xbh4-0 YUPas"><button type="button" class="prc-Button-ButtonBase-c50BI" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-describedby=":Rr5ab:-loading-announcement"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-HKbr-"><span data-component="text" class="prc-Button-Label-pTQ3x">Go to file</span></span></button></div><div class="react-directory-add-file-icon"></div><div class="react-directory-remove-file-icon"></div></div><button type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-c50BI" data-loading="false" data-size="medium" data-variant="primary" aria-describedby=":R55ab:-loading-announcement" id=":R55ab:"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-code hide-sm" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path></svg></span><span data-component="text" class="prc-Button-Label-pTQ3x">Code</span><span data-component="trailingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><div class="Box-sc-g0xbh4-0 izFOf"><button data-component="IconButton" type="button" aria-label="Open more actions menu" aria-haspopup="true" aria-expanded="false" tabindex="0" class="prc-Button-ButtonBase-c50BI prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="medium" data-variant="default" aria-describedby=":R75ab:-loading-announcement" id=":R75ab:"><svg aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button></div></div></div><div class="Box-sc-g0xbh4-0 vIPPs"><div data-hpc="true"><button hidden="" data-testid="focus-next-element-button" data-hotkey="j"></button><button hidden="" data-testid="focus-previous-element-button" data-hotkey="k"></button><h2 class="sr-only ScreenReaderHeading-module__userSelectNone--vW4Cq prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading" id="folders-and-files">Folders and files</h2><table aria-labelledby="folders-and-files" class="Box-sc-g0xbh4-0 fdROMU"><thead class="Box-sc-g0xbh4-0 jGKpsv"><tr class="Box-sc-g0xbh4-0 jdgHnn"><th colSpan="2" class="Box-sc-g0xbh4-0 bQivRW"><span class="text-bold">Name</span></th><th colSpan="1" class="Box-sc-g0xbh4-0 ldkMIO"><span class="text-bold">Name</span></th><th class="hide-sm"><div title="Last commit message" class="Truncate__StyledTruncate-sc-23o1d2-0 liVpTx width-fit"><span class="text-bold">Last commit message</span></div></th><th colSpan="1" class="Box-sc-g0xbh4-0 jMbWeI"><div title="Last commit date" class="Truncate__StyledTruncate-sc-23o1d2-0 liVpTx width-fit"><span class="text-bold">Last commit date</span></div></th></tr></thead><tbody><tr class="Box-sc-g0xbh4-0 gpqjiB"><td colSpan="3" class="bgColor-muted p-1 rounded-top-2"><div class="Box-sc-g0xbh4-0 dzCJzi"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone--vW4Cq prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading">Latest commit</h2><div style="width:120px" class="Skeleton Skeleton--text" data-testid="loading"> </div><div class="d-flex flex-shrink-0 gap-2"><div data-testid="latest-commit-details" class="d-none d-sm-flex flex-items-center"></div><div class="d-flex gap-2"><h2 class="sr-only ScreenReaderHeading-module__userSelectNone--vW4Cq prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading">History</h2><a href="/dotnetcore/Util/commits/master/" class="prc-Button-ButtonBase-c50BI d-none d-lg-flex LinkButton-module__code-view-link-button--xvCGA flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible" aria-describedby=":Raqj8pab:-loading-announcement"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span><span data-component="text" class="prc-Button-Label-pTQ3x"><span class="fgColor-default">1,161 Commits</span></span></span></a><div class="d-sm-none"></div><div class="d-flex d-lg-none"><span role="tooltip" aria-label="1,161 Commits" id="history-icon-button-tooltip" class="Tooltip__TooltipBase-sc-17tf59c-0 hWlpPn tooltipped-n"><a href="/dotnetcore/Util/commits/master/" class="prc-Button-ButtonBase-c50BI LinkButton-module__code-view-link-button--xvCGA flex-items-center fgColor-default" data-loading="false" data-size="small" data-variant="invisible" aria-describedby=":R1iqj8pab:-loading-announcement history-icon-button-tooltip"><span data-component="buttonContent" data-align="center" class="prc-Button-ButtonContent-HKbr-"><span data-component="leadingVisual" class="prc-Button-Visual-2epfX prc-Button-VisualWrap-Db-eB"><svg aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span></span></a></span></div></div></div></div></td></tr><tr class="react-directory-row undefined" id="folder-row-0"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="build" aria-label="build, (Directory)" class="Link--primary" href="/dotnetcore/Util/tree/master/build">build</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="build" aria-label="build, (Directory)" class="Link--primary" href="/dotnetcore/Util/tree/master/build">build</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-1"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="src" aria-label="src, (Directory)" class="Link--primary" href="/dotnetcore/Util/tree/master/src">src</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="src" aria-label="src, (Directory)" class="Link--primary" href="/dotnetcore/Util/tree/master/src">src</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-2"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="test" aria-label="test, (Directory)" class="Link--primary" href="/dotnetcore/Util/tree/master/test">test</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file-directory-fill icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="test" aria-label="test, (Directory)" class="Link--primary" href="/dotnetcore/Util/tree/master/test">test</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-3"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".gitignore" aria-label=".gitignore, (File)" class="Link--primary" href="/dotnetcore/Util/blob/master/.gitignore">.gitignore</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".gitignore" aria-label=".gitignore, (File)" class="Link--primary" href="/dotnetcore/Util/blob/master/.gitignore">.gitignore</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-4"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Directory.Build.props" aria-label="Directory.Build.props, (File)" class="Link--primary" href="/dotnetcore/Util/blob/master/Directory.Build.props">Directory.Build.props</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Directory.Build.props" aria-label="Directory.Build.props, (File)" class="Link--primary" href="/dotnetcore/Util/blob/master/Directory.Build.props">Directory.Build.props</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-5"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="LICENSE.txt" aria-label="LICENSE.txt, (File)" class="Link--primary" href="/dotnetcore/Util/blob/master/LICENSE.txt">LICENSE.txt</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="LICENSE.txt" aria-label="LICENSE.txt, (File)" class="Link--primary" href="/dotnetcore/Util/blob/master/LICENSE.txt">LICENSE.txt</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-6"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Util.sln" aria-label="Util.sln, (File)" class="Link--primary" href="/dotnetcore/Util/blob/master/Util.sln">Util.sln</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="Util.sln" aria-label="Util.sln, (File)" class="Link--primary" href="/dotnetcore/Util/blob/master/Util.sln">Util.sln</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-7"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="clear-bin.ps1" aria-label="clear-bin.ps1, (File)" class="Link--primary" href="/dotnetcore/Util/blob/master/clear-bin.ps1">clear-bin.ps1</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="clear-bin.ps1" aria-label="clear-bin.ps1, (File)" class="Link--primary" href="/dotnetcore/Util/blob/master/clear-bin.ps1">clear-bin.ps1</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-8"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="readme.md" aria-label="readme.md, (File)" class="Link--primary" href="/dotnetcore/Util/blob/master/readme.md">readme.md</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="octicon octicon-file color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="readme.md" aria-label="readme.md, (File)" class="Link--primary" href="/dotnetcore/Util/blob/master/readme.md">readme.md</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="Box-sc-g0xbh4-0 eNCcrz d-none" data-testid="view-all-files-row"><td colSpan="3" class="Box-sc-g0xbh4-0 bHTcCe"><div><button class="prc-Link-Link-85e08">View all files</button></div></td></tr></tbody></table></div><div class="Box-sc-g0xbh4-0 csrIcr"><div class="Box-sc-g0xbh4-0 bUQNHB"><div itemscope="" itemType="https://schema.org/abstract" class="Box-sc-g0xbh4-0 jPdcfu"><h2 class="_VisuallyHidden__VisuallyHidden-sc-11jhm7a-0 brGdpi">Repository files navigation</h2><nav class="Box-sc-g0xbh4-0 iphEWz prc-components-UnderlineWrapper-oOh5J" aria-label="Repository files"><ul class="prc-components-UnderlineItemList-b23Hf" role="list"><li class="Box-sc-g0xbh4-0 hUCRAk"><a class="prc-components-UnderlineItem-lJsg-" href="#" aria-current="page"><span data-component="icon"><svg aria-hidden="true" focusable="false" class="octicon octicon-book" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path></svg></span><span data-component="text" data-content="README">README</span></a></li><li class="Box-sc-g0xbh4-0 hUCRAk"><a class="prc-components-UnderlineItem-lJsg-" href="#"><span data-component="icon"><svg aria-hidden="true" focusable="false" class="octicon octicon-law" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z"></path></svg></span><span data-component="text" data-content="MIT license">MIT license</span></a></li></ul></nav><button style="--button-color:fg.subtle" type="button" aria-label="Outline" aria-haspopup="true" aria-expanded="false" tabindex="0" class="Box-sc-g0xbh4-0 cwoBXV prc-Button-ButtonBase-c50BI" data-loading="false" data-size="medium" data-variant="invisible" aria-describedby=":Rr9ab:-loading-announcement" id=":Rr9ab:"><svg aria-hidden="true" focusable="false" class="octicon octicon-list-unordered" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" display="inline-block" overflow="visible" style="vertical-align:text-bottom"><path d="M5.75 2.5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5ZM2 14a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm1-6a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM2 4a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg></button></div><div class="Box-sc-g0xbh4-0 QkQOb js-snippet-clipboard-copy-unpositioned undefined" data-hpc="true"><article class="markdown-body entry-content container-lg" itemprop="text"><div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Util应用框架介绍</h1><a id="user-content-util应用框架介绍" class="anchor" aria-label="Permalink: Util应用框架介绍" href="#util应用框架介绍"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"><a href="https://github.com/dotnetcore"><img src="https://camo.githubusercontent.com/51a97108a29c1dfe7a7eb1e085c9bae378040bcc3dd4c8ae99dbce33137b106c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6d656d62657225323070726f6a6563742532306f662d4e43432d3965323063392e737667" alt="Member project of .NET Core Community" data-canonical-src="https://img.shields.io/badge/member%20project%20of-NCC-9e20c9.svg" style="max-width: 100%;"></a> <a href="https://mit-license.org/" rel="nofollow"><img src="https://camo.githubusercontent.com/6581c31c16c1b13ddc2efb92e2ad69a93ddc4a92fd871ff15d401c4c6c9155a4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e737667" alt="GitHub license" data-canonical-src="https://img.shields.io/badge/license-MIT-blue.svg" style="max-width: 100%;"></a></p> <a href="https://www.jetbrains.com/?from=Util" rel="nofollow"> <img src="https://github.com/dotnetcore/Home/raw/master/img/jetbrains.svg" title="JetBrains" style="max-width: 100%;"> </a> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">什么是Util应用框架?</h2><a id="user-content-什么是util应用框架" class="anchor" aria-label="Permalink: 什么是Util应用框架?" href="#什么是util应用框架"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Util是一个.Net平台下的应用框架,旨在提升中小团队的开发能力,由工具类、分层架构基类、Ui组件,配套代码生成模板,权限等组成。</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Util应用框架的作者: <strong>何镇汐</strong></h2><a id="user-content-util应用框架的作者-何镇汐" class="anchor" aria-label="Permalink: Util应用框架的作者: 何镇汐" href="#util应用框架的作者-何镇汐"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Util应用框架的主要作者为何镇汐。</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Util应用框架的开源协议: <strong>MIT</strong></h2><a id="user-content-util应用框架的开源协议-mit" class="anchor" aria-label="Permalink: Util应用框架的开源协议: MIT" href="#util应用框架的开源协议-mit"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">这是最宽松的开源协议,意味着可以以任何方式使用该代码。</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Util应用框架的主要贡献者</h2><a id="user-content-util应用框架的主要贡献者" class="anchor" aria-label="Permalink: Util应用框架的主要贡献者" href="#util应用框架的主要贡献者"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"><a href="https://github.com/jianxuanbing" title="简楚恩">汪总</a> <a href="https://github.com/huxingye">胡兴业</a></p> <p dir="auto">这里只列出了主要贡献者,还有很多开发人员以不同形式对Util做出了宝贵贡献。</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Util应用框架的目标: <strong>让开发更简单</strong></h2><a id="user-content-util应用框架的目标-让开发更简单" class="anchor" aria-label="Permalink: Util应用框架的目标: 让开发更简单" href="#util应用框架的目标-让开发更简单"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Util应用框架让你的团队迅速进入业务开发状态,并在开发过程中持续提供帮助。</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Util应用框架的特点: <strong>简单易用</strong></h2><a id="user-content-util应用框架的特点-简单易用" class="anchor" aria-label="Permalink: Util应用框架的特点: 简单易用" href="#util应用框架的特点-简单易用"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Util应用框架的设计理念是追求Api简单化,尽量少的配置,不用精确记忆Api,有个模糊印象即可使用。</p> <p dir="auto">Util应用框架的学习成本相对较低,对于有.Net基础的开发人员,进行常规业务开发,通常在3天内上手。</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Util应用框架开发流程</h2><a id="user-content-util应用框架开发流程" class="anchor" aria-label="Permalink: Util应用框架开发流程" href="#util应用框架开发流程"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <blockquote> <p dir="auto"><em>搜集</em> - <em>整理</em> - <em>集成</em> - <em>封装</em></p> </blockquote> <p dir="auto">每当发现无法满足项目需求时,扩展框架的时刻来临。</p> <p dir="auto">从头造轮子是下策,所以总是先四处<strong>搜集</strong>相关资料。对于简单的需求,可能只需要找到一些代码片断即可。对于更专业的问题,需要寻求第三方技术框架的帮助。</p> <p dir="auto">找到解决方案并调试通过后,需要对代码进行<strong>整理</strong>,以符合我们的编程风格。</p> <p dir="auto">通常以Nuget包或Npm包的方式进行<strong>集成</strong>,为了降低学习成本,需要仔细考虑如何<strong>封装</strong>才能让调用者最省力。</p> <blockquote> <p dir="auto">任何有技术含量的工作,均由第三方技术框架完成,Util应用框架仅对技术框架选型并集成封装。</p> <p dir="auto">Util应用框架只是很薄的一层外观,为复杂的技术框架提供一个简易视图。</p> <p dir="auto">这导致更健壮的实现和更易用的API。</p> </blockquote> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Util应用框架的使用方式</h2><a id="user-content-util应用框架的使用方式" class="anchor" aria-label="Permalink: Util应用框架的使用方式" href="#util应用框架的使用方式"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">使用Util应用框架有几种不同的方式。</p> <p dir="auto">最灵活的方式是将Util应用框架的代码复制到你自己的应用框架中,然后可以随意修改它们来满足项目需求。</p> <p dir="auto">不过这种方式的代价也很大,很难合并Util的任何更新,你需要自行维护相当大的代码库。</p> <p dir="auto">由于Util应用框架的体积在不断增长,维护这些代码库可能给你带来不小的负担。</p> <p dir="auto">另一种可行的方式是将Util应用框架作为你的基础库,使用Nuget引入它们,基础的工作让Util应用框架帮你完成,你只需要扩展自己业务领域相关的功能。</p> <p dir="auto">这种方式的限制也很明显,Util提供的功能可能无法满足你的要求。</p> <p dir="auto">解决这个问题的关键是与Util开发团队保持沟通,将你的需求告诉我们。</p> <p dir="auto">对于通用功能,我们会尽量满足,这样会让更多的开发者受益,对于定制需求,我们也会为你提供扩展点,方便你能自行扩展。</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">框架核心</h2><a id="user-content-框架核心" class="anchor" aria-label="Permalink: 框架核心" href="#框架核心"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">启动器</h3><a id="user-content-启动器" class="anchor" aria-label="Permalink: 启动器" href="#启动器"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> </li> </ul> <p dir="auto">Util应用框架在项目启动时,会扫描全部程序集,并自动执行服务注册器,执行相关依赖配置.</p> <p dir="auto">启动器核心代码参考自 <a href="https://www.nopcommerce.com" rel="nofollow">NopCommerce</a> .</p> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">服务注册器</h3><a id="user-content-服务注册器" class="anchor" aria-label="Permalink: 服务注册器" href="#服务注册器"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> </li> </ul> <p dir="auto">项目启动扫描时,会加载所有的服务注册器,并按顺序执行.</p> <blockquote> <p dir="auto">服务注册器类似其它应用框架的模块概念,但功能有限.</p> <p dir="auto">只能用于配置依赖注入关系,无法获取服务提供程序,所以不能执行复杂的操作.</p> </blockquote> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">依赖注册器</h3><a id="user-content-依赖注册器" class="anchor" aria-label="Permalink: 依赖注册器" href="#依赖注册器"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> </li> </ul> <p dir="auto">扫描 ISingletonDependency, IScopeDependency, ITransientDependency 接口,并自动配置依赖.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">框架基础</h2><a id="user-content-框架基础" class="anchor" aria-label="Permalink: 框架基础" href="#框架基础"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">对象到对象映射</h3><a id="user-content-对象到对象映射" class="anchor" aria-label="Permalink: 对象到对象映射" href="#对象到对象映射"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> </li> </ul> <p dir="auto">技术选型: <a href="http://automapper.org/" rel="nofollow">AutoMapper</a>.</p> <p dir="auto">对象到对象映射主要用于分层对象之间的转换,比如从实体映射到DTO.</p> <p dir="auto">Util 在所有对象上添加 <strong>MapTo</strong> 扩展方法,自动完成基础配置,如果映射的两端对象属性名相同,则无需配置,直接使用即可.</p> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">AOP( 面向切面编程 )</h3><a id="user-content-aop-面向切面编程-" class="anchor" aria-label="Permalink: AOP( 面向切面编程 )" href="#aop-面向切面编程-"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> </li> </ul> <p dir="auto">技术选型: <a href="https://github.com/dotnetcore/AspectCore-Framework">AspectCore</a>.</p> <p dir="auto">AOP用于在调用方法时进行拦截,在执行前后添加自定义逻辑.</p> <p dir="auto">Util 主要使用AOP拦截器进行验证.</p> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">对象验证</h3><a id="user-content-对象验证" class="anchor" aria-label="Permalink: 对象验证" href="#对象验证"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> </li> </ul> <p dir="auto">Util 使用 DataAnnotation 注解作为基础验证方式,并提供 <strong>验证规则</strong> 和 <strong>验证处理器</strong> 等构造块进行自定义验证和处理.</p> <p dir="auto">Util 在实体,DTO等对象上添加了 <strong>Validate</strong> 方法, 以标准化的方式进行对象验证.</p> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">异常处理</h3><a id="user-content-异常处理" class="anchor" aria-label="Permalink: 异常处理" href="#异常处理"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> </li> </ul> <p dir="auto">Util 提供了 <strong>Warning</strong> 类型,表示业务异常,并封装相关异常操作.</p> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">身份认证和授权</h3><a id="user-content-身份认证和授权" class="anchor" aria-label="Permalink: 身份认证和授权" href="#身份认证和授权"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> </li> </ul> <p dir="auto">技术选型: <a href="https://learn.microsoft.com/zh-cn/aspnet/core/security/authentication/identity" rel="nofollow">Identity</a>, <a href="https://github.com/IdentityServer/IdentityServer4">Identity Server 4</a></p> <p dir="auto">Identity 是Asp.Net Core自带的身份认证框架,提供用户管理,登录认证等功能.</p> <blockquote> <p dir="auto">Identity Server 4 是一个身份认证服务器,用于颁发令牌和验证令牌等操作.</p> <p dir="auto">Identity Server 4 已经停止更新,它的新版本是收费的,Util 仅使用 Identity Server 4 的基础功能,由于它的基础功能已经十分稳定,暂时不需要迁移到其它框架.</p> </blockquote> <p dir="auto">Util 除了集成 Identity 和 Identity Server 4,还扩展了Asp.Net Core自定义授权策略,提供简单易行的Api访问控制方法.</p> <p dir="auto">Util Platform提供了基于角色和资源的权限管理功能,可以轻松设置前端UI菜单和按钮等权限,同时对后端API进行访问控制.</p> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">本地化</h3><a id="user-content-本地化" class="anchor" aria-label="Permalink: 本地化" href="#本地化"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> </li> </ul> <p dir="auto">技术选型: <a href="https://github.com/hishamco/My.Extensions.Localization.Json">My.Extensions.Localization.Json</a></p> <p dir="auto">Util 本地化支持Json文件或自定义数据存储方式.</p> <p dir="auto">My.Extensions.Localization.Json 提供了Json本地化功能.</p> <p dir="auto">由于无法满足项目需求, 以源码方式引入, 对健壮性和性能进行了提升.</p> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">日志</h3><a id="user-content-日志" class="anchor" aria-label="Permalink: 日志" href="#日志"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> </li> </ul> <p dir="auto">技术选型: <a href="https://serilog.net/" rel="nofollow">Serilog</a>, <a href="https://datalust.co/" rel="nofollow">Seq</a>, <a href="https://exceptionless.com/" rel="nofollow">Exceptionless</a></p> <p dir="auto">Serilog是.Net目前最流行的日志框架,支持结构化日志.</p> <p dir="auto">Seq 和 Exceptionless 是日志管理系统,提供了操作日志的界面,可以使用Serilog写入.</p> <p dir="auto">Util 对它们进行了轻度封装,集成了常用配置,并提供日志上下文等扩展.</p> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">缓存</h3><a id="user-content-缓存" class="anchor" aria-label="Permalink: 缓存" href="#缓存"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> </li> </ul> <p dir="auto">技术选型: <a href="https://github.com/dotnetcore/EasyCaching">EasyCaching</a></p> <p dir="auto">Util 集成了内存缓存和Redis缓存两种提供程序.</p> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">事件总线</h3><a id="user-content-事件总线" class="anchor" aria-label="Permalink: 事件总线" href="#事件总线"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> </li> </ul> <p dir="auto">技术选型: <a href="https://github.com/jbogard/MediatR">MediatR</a>, <a href="https://dapr.io/" rel="nofollow">Dapr</a></p> <blockquote> <p dir="auto">事件总线分为本地事件总线和集成事件总线.</p> </blockquote> <p dir="auto">Util 本地事件总线提供两种实现,默认使用Ioc方式实现,无需外部依赖. 另外引入了 MediatR 框架,它是流行的进程内事件处理框架.</p> <p dir="auto">集成事件总线用于微服务之间消息通信,Util 集成了 Dapr 微服务框架,基于 Dapr 的发布订阅实现集成事件总线.</p> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">模板引擎</h3><a id="user-content-模板引擎" class="anchor" aria-label="Permalink: 模板引擎" href="#模板引擎"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> </li> </ul> <p dir="auto">技术选型: <a href="https://github.com/adoconnection/razorenginecore">RazorEngineCore</a> , <a href="https://github.com/Handlebars-Net/Handlebars.Net">Handlebars.Net</a></p> <p dir="auto">Util 以源码方式引入 RazorEngineCore ,并进行大量修改.</p> <p dir="auto">Razor 模板引擎目前主要用在 Util 代码生成器.</p> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">图像处理</h3><a id="user-content-图像处理" class="anchor" aria-label="Permalink: 图像处理" href="#图像处理"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> </li> </ul> <p dir="auto">技术选型: <a href="https://sixlabors.com/" rel="nofollow">ImageSharp</a></p> <p dir="auto">ImageSharp 是一个图像处理库.</p> <p dir="auto">Util 使用 ImageSharp 实现动态文本头像生成.</p> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">文件存储</h3><a id="user-content-文件存储" class="anchor" aria-label="Permalink: 文件存储" href="#文件存储"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> </li> </ul> <p dir="auto">技术选型: <a href="http://minio.org.cn/" rel="nofollow">Minio</a></p> <p dir="auto">Minio 是流行的对象存储系统,适合部署到内部服务器.</p> <p dir="auto">Util 集成封装了 Minio SDK, 提供 存储桶名称处理策略, 文件名处理策略等构造块进行扩展处理.</p> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">后台任务</h3><a id="user-content-后台任务" class="anchor" aria-label="Permalink: 后台任务" href="#后台任务"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> </li> </ul> <p dir="auto">技术选型: <a href="https://www.quartz-scheduler.net/" rel="nofollow">Quartz</a> , <a href="https://www.hangfire.io/" rel="nofollow">HangFire</a></p> <p dir="auto">Util 封装了 Quartz 和 HangFire, 用于处理后台任务.</p> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">数据访问</h3><a id="user-content-数据访问" class="anchor" aria-label="Permalink: 数据访问" href="#数据访问"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> </li> </ul> <p dir="auto">技术选型: <a href="https://docs.microsoft.com/zh-cn/ef/core/" rel="nofollow">EntityFrameworkCore</a> , <a href="https://github.com/DapperLib/Dapper">Dapper</a></p> <p dir="auto">Util数据访问主要使用 EntityFrameworkCore ,它是.Net官方提供的ORM框架,属于重量级数据访问框架.</p> <p dir="auto">EntityFrameworkCore 支持工作单元模式,对复杂的业务处理非常有效,但对复杂的查询操作无能为力.</p> <p dir="auto">可以直接使用 EntityFrameworkCore 执行Sql语句, 但此操作非常原始,效率低下.</p> <p dir="auto">Dapper是轻量级数据访问框架, Util引入它并进行封装,用于解决查询问题.</p> <p dir="auto">目前 Util Dapper 封装尚不可用,它还缺乏分页,Lambda表达式支持等高级功能,现在仅用于代码生成读取元数据,后续会进行扩展.</p> <p dir="auto">由于使用国产数据库的需求逐渐增多,后续将考虑引入 <a href="https://github.com/dotnetcore/FreeSql">FreeSql</a> 数据访问框架.</p> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">工具类</h3><a id="user-content-工具类" class="anchor" aria-label="Permalink: 工具类" href="#工具类"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> </li> </ul> <p dir="auto">Util包含大量工具类,用于处理常用操作.</p> <ul dir="auto"> <li>类型转换操作</li> <li>Lambda操作</li> <li>命令行操作</li> <li>配置操作</li> <li>枚举操作</li> <li>Ioc操作</li> <li>Json操作</li> <li>字符串操作</li> <li>时间操作</li> <li>IP操作</li> <li>Web操作</li> <li>加密操作</li> <li>...</li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">架构支持</h2><a id="user-content-架构支持" class="anchor" aria-label="Permalink: 架构支持" href="#架构支持"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">多租户架构支持</h3><a id="user-content-多租户架构支持" class="anchor" aria-label="Permalink: 多租户架构支持" href="#多租户架构支持"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Saas系统支持多家客户使用同一系统,客户数据彼此隔离.</p> <p dir="auto">Util 参考了 <a href="https://abp.io/" rel="nofollow">ABP</a> 应用框架的多租户架构设计的租户解析和数据过滤部分.</p> <p dir="auto">Util 多租户架构在独立部署租户数据库方面基于 EntityFrameworkCore 的官方建议,有一些限制.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">DDD分层架构支持</h3><a id="user-content-ddd分层架构支持" class="anchor" aria-label="Permalink: DDD分层架构支持" href="#ddd分层架构支持"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Util 分层架构基于领域驱动设计(DDD) 和 企业应用架构模式(POEAA) 的基础构造块.</p> <p dir="auto">.Net 早期流行的分层架构是三层架构, 对于不熟悉 DDD 的开发人员,可以把它当成三层架构使用,不过术语的变化而已.</p> <p dir="auto">但是对于有一定领域模型使用经验的开发人员,该架构在处理更复杂的业务时可以有效管控复杂性.</p> <p dir="auto">对于复杂模块的开发,该架构与三层架构的主要区别在于,实体是作为简单数据容器,还是作为业务处理的场所.</p> <p dir="auto">对于很多业务领域,将实体对应的业务操作封装到实体本身,可以提升业务表达能力和封装性.</p> <p dir="auto">Util 分层架构分为四层.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">领域层</h4><a id="user-content-领域层" class="anchor" aria-label="Permalink: 领域层" href="#领域层"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">领域层是Util分层架构的核心.</p> <p dir="auto">领域层非常纯净, 没有对数据访问和UI的依赖,很容易对该层进行单元测试.</p> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">聚合根</h5><a id="user-content-聚合根" class="anchor" aria-label="Permalink: 聚合根" href="#聚合根"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">作为并发单元的最外层实体.</p> </li> <li> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">实体</h5><a id="user-content-实体" class="anchor" aria-label="Permalink: 实体" href="#实体"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">由唯一标识决定的业务对象.</p> </li> <li> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">值对象</h5><a id="user-content-值对象" class="anchor" aria-label="Permalink: 值对象" href="#值对象"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">表示实体属性值的对象.</p> </li> <li> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">仓储</h5><a id="user-content-仓储" class="anchor" aria-label="Permalink: 仓储" href="#仓储"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">表示聚合根的集合,用于进行数据访问.</p> </li> <li> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">领域服务</h5><a id="user-content-领域服务" class="anchor" aria-label="Permalink: 领域服务" href="#领域服务"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">用于封装多个聚合根的操作.</p> </li> <li> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">领域事件</h5><a id="user-content-领域事件" class="anchor" aria-label="Permalink: 领域事件" href="#领域事件"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">表示实体数据发生变化.</p> <p dir="auto">使用Util本地事件总线发布领域事件.</p> <p dir="auto">有几个标准领域事件:</p> <ul dir="auto"> <li>EntityChangedEvent - 实体变更事件</li> <li>EntityCreatedEvent - 实体创建事件</li> <li>EntityUpdatedEvent - 实体修改事件</li> <li>EntityDeletedEvent - 实体删除事件</li> </ul> </li> </ul> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">基础设施层</h4><a id="user-content-基础设施层" class="anchor" aria-label="Permalink: 基础设施层" href="#基础设施层"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">对于大多项目,基础设施层主要包含数据访问的实现.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">应用层</h4><a id="user-content-应用层" class="anchor" aria-label="Permalink: 应用层" href="#应用层"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">集成了领域层和基础设施层,为UI提供服务.</p> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">应用服务</h5><a id="user-content-应用服务" class="anchor" aria-label="Permalink: 应用服务" href="#应用服务"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">应用服务接收UI请求,并将调用委托给实体,领域服务等构造块完成业务功能.</p> <p dir="auto">对于普通项目,业务逻辑直接在应用服务中实现即可,这与三层架构相似.</p> </li> <li> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">数据传输对象(DTO)</h5><a id="user-content-数据传输对象dto" class="anchor" aria-label="Permalink: 数据传输对象(DTO)" href="#数据传输对象dto"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">数据传输对象是一种用来传递参数的对象.</p> </li> <li> <div class="markdown-heading" dir="auto"><h5 tabindex="-1" class="heading-element" dir="auto">查询参数对象</h5><a id="user-content-查询参数对象" class="anchor" aria-label="Permalink: 查询参数对象" href="#查询参数对象"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">查询参数对象是一种专门用来传递查询参数的对象.</p> </li> </ul> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">表现层</h4><a id="user-content-表现层" class="anchor" aria-label="Permalink: 表现层" href="#表现层"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">微服务架构支持</h3><a id="user-content-微服务架构支持" class="anchor" aria-label="Permalink: 微服务架构支持" href="#微服务架构支持"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Util 集成了 <a href="https://dapr.io/" rel="nofollow">Dapr</a> ,它是微软主推的微服务框架.</p> <p dir="auto">Util 封装了 Dapr Http同步调用,异步事件发布订阅,状态存储等功能.</p> <p dir="auto">并对身份认证,事件日志,事件重发等重要功能进行扩展.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">常见业务功能支持</h3><a id="user-content-常见业务功能支持" class="anchor" aria-label="Permalink: 常见业务功能支持" href="#常见业务功能支持"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">树形结构支持</h4><a id="user-content-树形结构支持" class="anchor" aria-label="Permalink: 树形结构支持" href="#树形结构支持"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">有些数据包含层次结构.</p> <p dir="auto">Util 分层架构包含对树形结构的支持.</p> <p dir="auto">如果使用 Util UI,无论加载树形表格还是树形,继承基类即可实现功能.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">审计支持</h4><a id="user-content-审计支持" class="anchor" aria-label="Permalink: 审计支持" href="#审计支持"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">大多操作需要记录创建人,创建时间,修改人,修改时间等审计信息.</p> <p dir="auto">Util支持保存时自动设置审计信息.</p> <p dir="auto">Util 审计设计参考自 <a href="https://abp.io/" rel="nofollow">ABP</a> 应用框架.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">逻辑删除支持</h4><a id="user-content-逻辑删除支持" class="anchor" aria-label="Permalink: 逻辑删除支持" href="#逻辑删除支持"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Util 支持逻辑删除,删除时更新为已删除状态,查询时自动过滤已删除记录.</p> <p dir="auto">Util 逻辑删除设计参考自 <a href="https://abp.io/" rel="nofollow">ABP</a> 应用框架.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">对象变更值支持</h4><a id="user-content-对象变更值支持" class="anchor" aria-label="Permalink: 对象变更值支持" href="#对象变更值支持"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">修改时可能需要获取对象哪些数据发生了变化.</p> <p dir="auto">Util 提供多种方式获取对象变更值记录.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">代码生成</h2><a id="user-content-代码生成" class="anchor" aria-label="Permalink: 代码生成" href="#代码生成"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">由于 Util 采用 DDD分层架构,导致简单需求也需要创建大量的类型.</p> <p dir="auto">手工创建这些类型效率低下,通过代码生成迅速创建它们,可以大幅提升开发效率和质量.</p> <p dir="auto">Util 配套代码生成器, 简单易用, 可解决大部分机械工作.</p> <p dir="auto">在生成的代码基础上进行修改,比从头开始工作要好得多.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">UI 技术选型</h2><a id="user-content-ui-技术选型" class="anchor" aria-label="Permalink: UI 技术选型" href="#ui-技术选型"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Js语言</h3><a id="user-content-js语言" class="anchor" aria-label="Permalink: Js语言" href="#js语言"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"><a href="https://www.typescriptlang.org/zh/" rel="nofollow">TypeScript</a></h4><a id="user-content-typescript" class="anchor" aria-label="Permalink: TypeScript" href="#typescript"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">TypeScript 是 微软开发的脚本语言, 扩展了弱类型的 Javascript,提供增强的语法和强类型支持.</p> <p dir="auto">为编辑器代码提示和语法错误检测奠定坚实基础.</p> </li> </ul> </li> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Js框架</h3><a id="user-content-js框架" class="anchor" aria-label="Permalink: Js框架" href="#js框架"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"><a href="https://angular.io" rel="nofollow">Angular</a></h4><a id="user-content-angular" class="anchor" aria-label="Permalink: Angular" href="#angular"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Angular 是 Google开发的 Js框架.</p> <p dir="auto">Angular使用 TypeScript 脚本语言开发, 并采用 <a href="https://github.com/ReactiveX/RxJS">RxJs</a> 响应式编程框架.</p> <p dir="auto">Angular 是前端Js三大框架之一,另外两个是 Vue 和 React.</p> <p dir="auto">Util UI 用于开发管理后台,选择 Angular 是因为它的语法最优雅, 也最符合后端开发人员的习惯.</p> </li> </ul> </li> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Angular 组件库</h3><a id="user-content-angular-组件库" class="anchor" aria-label="Permalink: Angular 组件库" href="#angular-组件库"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"><a href="https://ng.ant.design/" rel="nofollow">Ng Zorro</a></h4><a id="user-content-ng-zorro" class="anchor" aria-label="Permalink: Ng Zorro" href="#ng-zorro"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Ng Zorro 是阿里 Ant Design 的 Angular 版本,提供 80+ 常用组件,覆盖大部分业务开发场景.</p> </li> <li> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"><a href="https://ng-alain.com/" rel="nofollow">Ng Alain</a></h4><a id="user-content-ng-alain" class="anchor" aria-label="Permalink: Ng Alain" href="#ng-alain"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">虽然 Ng Zorro 提供了大量常用组件,但项目开发需要一个集成度更高的环境.</p> <p dir="auto">Ng Alain 是一个基架项目, 集成了 Ng Zorro 组件,提供业务开发的项目模板,除了菜单导航等框架元素,还有很多开箱即用的业务处理页面模板.</p> </li> </ul> </li> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Angular 微前端框架</h3><a id="user-content-angular-微前端框架" class="anchor" aria-label="Permalink: Angular 微前端框架" href="#angular-微前端框架"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto"><a href="https://github.com/angular-architects/module-federation-plugin">Angular Module Federation</a></h4><a id="user-content-angular-module-federation" class="anchor" aria-label="Permalink: Angular Module Federation" href="#angular-module-federation"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">如果你的项目包含大量 Angular 模块,所有文件在同一个项目中,会导致开发环境卡顿和缓慢.</p> <p dir="auto">发布项目也可能需要很长时间.</p> <p dir="auto">另外,如果某个模块需要进行修改,哪怕只修改一行代码,也需要对所有模块重新发布.</p> <p dir="auto">与后端的微服务类似,微前端是前端的项目拆分方法.</p> <p dir="auto">微前端将不同的 Angular 模块拆分到不同项目中,可以独立开发,独立测试和独立部署.</p> <blockquote> <p dir="auto">无论你是否使用微服务架构,均可使用微前端拆分方式.</p> </blockquote> <p dir="auto">Angular Module Federation 是基于Webpack模块联合的Angular微前端解决方案.</p> </li> </ul> </li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Util Angular UI 特点</h2><a id="user-content-util-angular-ui-特点" class="anchor" aria-label="Permalink: Util Angular UI 特点" href="#util-angular-ui-特点"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">组件扩展支持</h3><a id="user-content-组件扩展支持" class="anchor" aria-label="Permalink: 组件扩展支持" href="#组件扩展支持"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">除了支持 Ng Zorro 原生功能外,Util UI还对常用组件进行了扩展.</p> <p dir="auto">最重要的扩展是支持常用组件直接发出 Api 请求,而不用定义额外的服务.</p> </li> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Razor TagHelper 支持</h3><a id="user-content-razor-taghelper-支持" class="anchor" aria-label="Permalink: Razor TagHelper 支持" href="#razor-taghelper-支持"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Util Angular UI不仅可以使用 html 页面,还能使用 .Net Razor 页面.</p> <p dir="auto">Razor 页面可以使用 TagHelper 服务端标签.</p> <p dir="auto">Util 已将大部分 Ng Zorro 组件封装为 TagHelper 标签.</p> <p dir="auto">除了获得强类型提示外,TagHelper 作为抽象层,提供更简洁的标签语法.</p> <p dir="auto">另一个强大之处在于Lambda表达式支持, 可以将DTO直接绑定到 TagHelper 标签上.</p> <p dir="auto">能够从Lambda表达式提取元数据,并自动设置大量常用属性,比如name,验证,模型绑定等.</p> </li> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">前后分离</h3><a id="user-content-前后分离" class="anchor" aria-label="Permalink: 前后分离" href="#前后分离"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">一些开发人员看到 Util Angular UI 使用 .Net Razor 页面,可能认为 UI 与 .Net 高度耦合,但现在的趋势是前后分离.</p> <p dir="auto">所谓前后分离,是前端UI和后端API没有依赖,更换某一端对另一端没有影响.</p> <p dir="auto">另外,前后分离后,前端UI和后端API可以由不同的开发人员完成.</p> <p dir="auto">.Net Razor页面仅在开发阶段提供帮助,在发布时, Razor 页面会转换为 html ,后续发布流程与纯前端开发方式相同.</p> <p dir="auto">一旦发布成功,将完全脱离.Net 环境,可以使用 Nginx 容器承载它.</p> <p dir="auto">发布后的产物,与你使用纯前端方式开发打包没有区别.</p> <p dir="auto">如果你喜欢,可以把后端API换成JAVA,也能正常运行.</p> </li> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">配套Api支持</h3><a id="user-content-配套api支持" class="anchor" aria-label="Permalink: 配套Api支持" href="#配套api支持"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">前端UI和后端API的开发是两个完全不同的领域.</p> <p dir="auto">但开发一个功能,又需要前端和后端的配合,他们需要沟通,作出一些约定.</p> <p dir="auto">对于配合不到位的团队,前后端的沟通成本可能很高,另外提供的API可能无法满足UI的需求,从而让前端代码变得畸形.</p> <p dir="auto">通常.Net开发人员的Js编程功底高于常规前端人员,前端人员更擅长样式布局.</p> <p dir="auto">Util Angular UI 不仅提供对前端组件的封装,同时也为常见功能提供 Api 支持.</p> <p dir="auto">对于使用 Util Angular UI 的团队, 将 UI 和 API 交给同一个.Net开发人员就是最好的选择.</p> <p dir="auto">前端人员仅调整界面样式即可.</p> <p dir="auto">不仅减少了沟通成本, API和前端组件的高度集成封装,让常规功能的开发效率得到大幅提升.</p> <p dir="auto">当然,这对 .Net 开发人员的水平有一定要求.</p> </li> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">本地化支持</h3><a id="user-content-本地化支持" class="anchor" aria-label="Permalink: 本地化支持" href="#本地化支持"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">得益于 Ng Alain 本地化的良好设计, 可以使用 i18n 管道进行文本的本地化转换.</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="'文本' | i18n"><pre class="notranslate"><code>'文本' | i18n </code></pre></div> <p dir="auto">不过对于需要支持本地化的项目,这依然是一个负担,每个表单项,每个表格项,每个文本,可能都需要添加 i18n 管道.</p> <p dir="auto">Util Angular UI 让本地化开发更进一步,对大部分组件提供了本地化支持,只有极少数文本需要手工添加 i18n 管道.</p> </li> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">授权访问支持</h3><a id="user-content-授权访问支持" class="anchor" aria-label="Permalink: 授权访问支持" href="#授权访问支持"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Ng Alain提供了授权访问的支持.</p> <p dir="auto">Util Platform权限模块基于资源和角色的设计,可以很好的与 Ng Alain授权进行集成.</p> <p dir="auto">你可以控制菜单和任意区域根据权限显示和隐藏.</p> </li> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">微前端支持</h3><a id="user-content-微前端支持" class="anchor" aria-label="Permalink: 微前端支持" href="#微前端支持"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Util Angular UI 引入了 <a href="https://github.com/angular-architects/module-federation-plugin">Angular Module Federation</a> , 能够将 Angular 模块拆分到不同项目中,可以独立开发,独立测试和独立部署.</p> <p dir="auto">对于大中型项目,这是非常有必要的.</p> </li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Util Angular UI 功能列表</h2><a id="user-content-util-angular-ui-功能列表" class="anchor" aria-label="Permalink: Util Angular UI 功能列表" href="#util-angular-ui-功能列表"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Util Angular UI 主要由 util-angular 和 Util.Ui.NgZorro 两个库提供支持.</p> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">util-angular 功能列表</h3><a id="user-content-util-angular-功能列表" class="anchor" aria-label="Permalink: util-angular 功能列表" href="#util-angular-功能列表"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"><a href="https://github.com/util-core/util-angular">util-angular</a> 是一个 Js 库, 由Curd组件基类, Ng Zorro常用组件扩展指令和一组工具类组成.</p> <ul dir="auto"> <li> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">基础类型</h4><a id="user-content-基础类型" class="anchor" aria-label="Permalink: 基础类型" href="#基础类型"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li>ViewModel - 视图模型基类</li> <li>TreeViewModel - 树形视图模型基类</li> <li>TreeNode - 树形节点基类</li> <li>PageList - 分页列表</li> <li>QueryParameter - 查询参数基类</li> <li>TreeQueryParameter - 树形查询参数基类</li> <li>Result - 服务端返回结果</li> <li>StateCode - 服务端状态码约定</li> <li>SelectItem - 列表项</li> <li>SelectList - 列表</li> <li>SelectOptionGroup - 列表配置组</li> <li>SelectOption - 列表配置项</li> </ul> </li> <li> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">工具类</h4><a id="user-content-工具类-1" class="anchor" aria-label="Permalink: 工具类" href="#工具类-1"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li>浏览器本地存储操作</li> <li>Cookie操作</li> <li>事件总线操作</li> <li>本地化操作</li> <li>Ioc操作</li> <li>加载操作</li> <li>路由操作</li> <li>弹出层操作</li> <li>抽屉操作</li> <li>表单操作</li> <li>Http操作</li> <li>Web Api操作</li> <li>消息操作</li> <li>...</li> </ul> </li> <li> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Crud组件基类</h4><a id="user-content-crud组件基类" class="anchor" aria-label="Permalink: Crud组件基类" href="#crud组件基类"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li>编辑组件基类</li> <li>表格编辑组件基类</li> <li>树形编辑组件基类</li> <li>查询组件基类</li> <li>表格查询组件基类</li> <li>树形表格查询组件基类</li> </ul> </li> <li> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Ng Zorro指令扩展</h4><a id="user-content-ng-zorro指令扩展" class="anchor" aria-label="Permalink: Ng Zorro指令扩展" href="#ng-zorro指令扩展"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li>必填项验证扩展指令</li> <li>验证消息扩展指令</li> <li>Ng Zorro 按钮扩展指令</li> <li>Ng Zorro 选择框扩展指令</li> <li>Ng Zorro 表格扩展指令</li> <li>Ng Zorro 表格编辑扩展指令</li> <li>Ng Zorro 树形表格扩展指令</li> <li>Ng Zorro 树形扩展指令</li> <li>Ng Zorro 上传扩展指令</li> </ul> </li> </ul> </li> <li> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Util.Ui.NgZorro 库介绍</h3><a id="user-content-utiluingzorro-库介绍" class="anchor" aria-label="Permalink: Util.Ui.NgZorro 库介绍" href="#utiluingzorro-库介绍"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Util.Ui.NgZorro 是一个 C# 类库,包含 TagHelper标签和树形控制器等类型.</p> <p dir="auto">绝大部分 Ng Zorro 组件已经封装.</p> <p dir="auto">由于组件很多,就不一一列出.</p> </li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Util Angular UI 已知缺陷</h2><a id="user-content-util-angular-ui-已知缺陷" class="anchor" aria-label="Permalink: Util Angular UI 已知缺陷" href="#util-angular-ui-已知缺陷"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Util Angular UI 所有已知缺陷均已解决.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Util Angular UI 适合你吗?</h2><a id="user-content-util-angular-ui-适合你吗" class="anchor" aria-label="Permalink: Util Angular UI 适合你吗?" href="#util-angular-ui-适合你吗"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Util Angular UI 是为 .Net 全栈工程师准备的,如果你喜欢更简洁的语法,希望开发的成本更低,它就适合你.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">参考应用框架</h2><a id="user-content-参考应用框架" class="anchor" aria-label="Permalink: 参考应用框架" href="#参考应用框架"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">很明显,闭门造车不可取。</p> <p dir="auto">Util应用框架大部分依赖以Nuget方式引入,极少部分需要修改源码,则以复制源码方式使用。</p> <p dir="auto">另外,.Net应用框架还有很多优秀的开源项目,从中学习和吸取养分是Util成长的关键。</p> <p dir="auto">Util应用框架主要参考了以下开源项目,从中吸收架构和代码,并以Util风格进行整理。</p> <ul dir="auto"> <li> <p dir="auto"><a href="https://abp.io/" rel="nofollow">ABP</a></p> </li> <li> <p dir="auto"><a href="https://www.nopcommerce.com" rel="nofollow">NopCommerce</a></p> </li> <li> <p dir="auto"><a href="https://cslanet.com/" rel="nofollow">Csla</a></p> </li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Util应用框架相关资源</h2><a id="user-content-util应用框架相关资源" class="anchor" aria-label="Permalink: Util应用框架相关资源" href="#util应用框架相关资源"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Util教程目录</h3><a id="user-content-util教程目录" class="anchor" aria-label="Permalink: Util教程目录" href="#util教程目录"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li> <p dir="auto">知乎: <a href="https://zhuanlan.zhihu.com/p/663947596" rel="nofollow">https://zhuanlan.zhihu.com/p/663947596</a></p> </li> <li> <p dir="auto">掘金: <a href="https://juejin.cn/post/7298765809290477607" rel="nofollow">https://juejin.cn/post/7298765809290477607</a></p> </li> </ul> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Github项目地址</h3><a id="user-content-github项目地址" class="anchor" aria-label="Permalink: Github项目地址" href="#github项目地址"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li> <p dir="auto"><strong>Util</strong> <a href="https://github.com/dotnetcore/Util">https://github.com/dotnetcore/Util</a></p> <p dir="auto">该项目包含Util应用框架全部源码。</p> </li> <li> <p dir="auto"><strong>Util.Generator</strong> <a href="https://github.com/util-core/Util.Generator">https://github.com/util-core/Util.Generator</a></p> <p dir="auto">该项目提供Util代码生成模板,帮助你迅速创建业务项目基架。</p> </li> <li> <p dir="auto"><strong>util-angular</strong> <a href="https://github.com/util-core/util-angular">https://github.com/util-core/util-angular</a></p> <p dir="auto">该项目是对angular,ng zorro,ng alain前端框架的二次封装Js库,与Util.Ui.NgZorro类库配合使用。</p> </li> <li> <p dir="auto"><strong>Util.Platform.Single</strong> <a href="https://github.com/util-core/Util.Platform.Single">https://github.com/util-core/Util.Platform.Single</a></p> <p dir="auto">使用新的应用框架通常具有高昂的成本,为帮助你减轻初始负担,该项目提供一些常用业务功能,你可以将它作为项目起点。</p> <p dir="auto">目前提供了权限管理模块,可以控制到菜单和按钮,并能基于角色资源对API进行访问控制,后续将不断完善其它常用功能。</p> <p dir="auto">该项目提供单体和微服务两个版本,Util.Platform.Single是单体版本。</p> </li> <li> <p dir="auto"><strong>Util.Platform.Dapr</strong> <a href="https://github.com/util-core/Util.Platform.Dapr">https://github.com/util-core/Util.Platform.Dapr</a></p> <p dir="auto">它是Util Platform的微服务版本,采用Dapr微服务框架,项目结构参考自eShopOnDapr。</p> </li> <li> <p dir="auto"><strong>Util.Platform.Share</strong> <a href="https://github.com/util-core/Util.Platform.Share">https://github.com/util-core/Util.Platform.Share</a></p> <p dir="auto">包含Util.Platform.Single和Util.Platform.Dapr的共享代码,并发布到Nuget,供两个版本使用。</p> </li> </ul> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Gitee项目地址</h3><a id="user-content-gitee项目地址" class="anchor" aria-label="Permalink: Gitee项目地址" href="#gitee项目地址"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"><strong>由于国内访问Github非常缓慢,现在Util所有项目发布时会在Gitee进行同步更新。</strong></p> <ul dir="auto"> <li><strong>Util</strong> <a href="https://gitee.com/util-core/util" rel="nofollow">https://gitee.com/util-core/util</a></li> <li><strong>Util.Generator</strong> <a href="https://gitee.com/util-core/Util.Generator" rel="nofollow">https://gitee.com/util-core/Util.Generator</a></li> <li><strong>util-angular</strong> <a href="https://gitee.com/util-core/util-angular" rel="nofollow">https://gitee.com/util-core/util-angular</a></li> <li><strong>Util.Platform.Single</strong> <a href="https://gitee.com/util-core/Util.Platform.Single" rel="nofollow">https://gitee.com/util-core/Util.Platform.Single</a></li> <li><strong>Util.Platform.Dapr</strong> <a href="https://gitee.com/util-core/Util.Platform.Dapr" rel="nofollow">https://gitee.com/util-core/Util.Platform.Dapr</a></li> <li><strong>Util.Platform.Share</strong> <a href="https://gitee.com/util-core/Util.Platform.Share" rel="nofollow">https://gitee.com/util-core/Util.Platform.Share</a></li> </ul> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Nuget包</h3><a id="user-content-nuget包" class="anchor" aria-label="Permalink: Nuget包" href="#nuget包"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <markdown-accessiblity-table><table> <thead> <tr> <th>包名</th> <th>版本</th> <th>下载量</th> </tr> </thead> <tbody> <tr> <td>Util.Core</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c07f4609b6bedb992b2f35e3d3aed433b436820ef0fd8966aea5c42b8d037d2f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e436f72652e737667"><img src="https://camo.githubusercontent.com/c07f4609b6bedb992b2f35e3d3aed433b436820ef0fd8966aea5c42b8d037d2f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e436f72652e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Core.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4cb78b23b70ac2eb22073590f632714dd04c433fa122f356bd90f4dda27c6c38/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e436f72652e737667"><img src="https://camo.githubusercontent.com/4cb78b23b70ac2eb22073590f632714dd04c433fa122f356bd90f4dda27c6c38/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e436f72652e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Core.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.ObjectMapping.AutoMapper</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/0ca4e6cb38637d4b8f561f279e553c61febd79b64212af11e38475c888aceac0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4f626a6563744d617070696e672e4175746f4d61707065722e737667"><img src="https://camo.githubusercontent.com/0ca4e6cb38637d4b8f561f279e553c61febd79b64212af11e38475c888aceac0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4f626a6563744d617070696e672e4175746f4d61707065722e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.ObjectMapping.AutoMapper.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/439177052a90a53884477fbfe44a24bd8340ddd09a440b64af74d6bf1b3487a1/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4f626a6563744d617070696e672e4175746f4d61707065722e737667"><img src="https://camo.githubusercontent.com/439177052a90a53884477fbfe44a24bd8340ddd09a440b64af74d6bf1b3487a1/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4f626a6563744d617070696e672e4175746f4d61707065722e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.ObjectMapping.AutoMapper.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Aop.AspectCore</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/3589f28c06c1321cb005972d77236638646a1d973d2fc77fdd18c0593a0896a0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e416f702e417370656374436f72652e737667"><img src="https://camo.githubusercontent.com/3589f28c06c1321cb005972d77236638646a1d973d2fc77fdd18c0593a0896a0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e416f702e417370656374436f72652e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Aop.AspectCore.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/2cf3f4c3de7488503caf093a51eba66974a1b13789714d9daedb5758bf618518/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e416f702e417370656374436f72652e737667"><img src="https://camo.githubusercontent.com/2cf3f4c3de7488503caf093a51eba66974a1b13789714d9daedb5758bf618518/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e416f702e417370656374436f72652e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Aop.AspectCore.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Validation</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/83fc2f5b4ddc1ea9427b670ff66b66cad2a8edea3132848b323c4e9ef7839b96/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e56616c69646174696f6e2e737667"><img src="https://camo.githubusercontent.com/83fc2f5b4ddc1ea9427b670ff66b66cad2a8edea3132848b323c4e9ef7839b96/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e56616c69646174696f6e2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Validation.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/a4c13303024d0607e817e5f31e821c65645fcea1ddf902c343a8dbfeffa336f7/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e56616c69646174696f6e2e737667"><img src="https://camo.githubusercontent.com/a4c13303024d0607e817e5f31e821c65645fcea1ddf902c343a8dbfeffa336f7/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e56616c69646174696f6e2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Validation.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Security</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/e26640d4d2e9bdc211c96de890558843f5d5c2489194565130efe6df2d91cb5d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e53656375726974792e737667"><img src="https://camo.githubusercontent.com/e26640d4d2e9bdc211c96de890558843f5d5c2489194565130efe6df2d91cb5d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e53656375726974792e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Security.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/ef2c4d6fb0810976409e1cbd32ef96e2173f39957e1840019297b71c52fe3f25/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e53656375726974792e737667"><img src="https://camo.githubusercontent.com/ef2c4d6fb0810976409e1cbd32ef96e2173f39957e1840019297b71c52fe3f25/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e53656375726974792e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Security.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Data.Abstractions</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4a6515d44d0646c44a7b101bcec45edb4fd79edfaafa9baaa69384b68ee7d4fa/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4162737472616374696f6e732e737667"><img src="https://camo.githubusercontent.com/4a6515d44d0646c44a7b101bcec45edb4fd79edfaafa9baaa69384b68ee7d4fa/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4162737472616374696f6e732e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Data.Abstractions.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/84b1050da1db99d8862f8b562cde49adbd8e183f7b4723e465e545357fb4aa7a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4162737472616374696f6e732e737667"><img src="https://camo.githubusercontent.com/84b1050da1db99d8862f8b562cde49adbd8e183f7b4723e465e545357fb4aa7a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4162737472616374696f6e732e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Data.Abstractions.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.AspNetCore</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/8f2ce382822c90de69576e2357215806157cf5ba712889cded38af733c197f9b/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4173704e6574436f72652e737667"><img src="https://camo.githubusercontent.com/8f2ce382822c90de69576e2357215806157cf5ba712889cded38af733c197f9b/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4173704e6574436f72652e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.AspNetCore.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/dd94585903d226712b7611f654a229ee9c8f4052c32334cb4628ea5cb0025caf/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4173704e6574436f72652e737667"><img src="https://camo.githubusercontent.com/dd94585903d226712b7611f654a229ee9c8f4052c32334cb4628ea5cb0025caf/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4173704e6574436f72652e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.AspNetCore.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Localization</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/d13ad2641840e8b7455a3aec452f02db6918ed7635cac64e61713984d2e7a95d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4c6f63616c697a6174696f6e2e737667"><img src="https://camo.githubusercontent.com/d13ad2641840e8b7455a3aec452f02db6918ed7635cac64e61713984d2e7a95d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4c6f63616c697a6174696f6e2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Localization.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/89a258d525d8638e6e45f526b9217e36fe9394d65c60668009ea116dbef1b4dd/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4c6f63616c697a6174696f6e2e737667"><img src="https://camo.githubusercontent.com/89a258d525d8638e6e45f526b9217e36fe9394d65c60668009ea116dbef1b4dd/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4c6f63616c697a6174696f6e2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Localization.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Logging</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/29ce2fb42f51a35721d7d427cd2ae61306ddde312651939190426f064197a800/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4c6f6767696e672e737667"><img src="https://camo.githubusercontent.com/29ce2fb42f51a35721d7d427cd2ae61306ddde312651939190426f064197a800/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4c6f6767696e672e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Logging.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/3947e437800d5c387b1ae763b18d9cd82b4536577d6135cc4c6239fbd64a58e3/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4c6f6767696e672e737667"><img src="https://camo.githubusercontent.com/3947e437800d5c387b1ae763b18d9cd82b4536577d6135cc4c6239fbd64a58e3/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4c6f6767696e672e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Logging.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Logging.Serilog</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/617c6d2e601b0d6b042862d4b2adf19aefe7df59f43c1b78f146acbc285a9b9f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4c6f6767696e672e536572696c6f672e737667"><img src="https://camo.githubusercontent.com/617c6d2e601b0d6b042862d4b2adf19aefe7df59f43c1b78f146acbc285a9b9f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4c6f6767696e672e536572696c6f672e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Logging.Serilog.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/9ddfac5a2d807829e33556f8261714fd3fe7bea24d564752531d3e70dba083e7/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4c6f6767696e672e536572696c6f672e737667"><img src="https://camo.githubusercontent.com/9ddfac5a2d807829e33556f8261714fd3fe7bea24d564752531d3e70dba083e7/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4c6f6767696e672e536572696c6f672e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Logging.Serilog.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Logging.Serilog.Exceptionless</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/b3f8d2c8bf1685cdbdd9b0c9508d31967828c84cd51dcf65359045c478959e95/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4c6f6767696e672e536572696c6f672e457863657074696f6e6c6573732e737667"><img src="https://camo.githubusercontent.com/b3f8d2c8bf1685cdbdd9b0c9508d31967828c84cd51dcf65359045c478959e95/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4c6f6767696e672e536572696c6f672e457863657074696f6e6c6573732e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Logging.Serilog.Exceptionless.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/1512ae25973175cc64035fd0a58a184220f00e3019f7e2c8a5638eea1a148dd6/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4c6f6767696e672e536572696c6f672e457863657074696f6e6c6573732e737667"><img src="https://camo.githubusercontent.com/1512ae25973175cc64035fd0a58a184220f00e3019f7e2c8a5638eea1a148dd6/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4c6f6767696e672e536572696c6f672e457863657074696f6e6c6573732e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Logging.Serilog.Exceptionless.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Events.Abstractions</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/45cf6513823fe0b22a57f67d0e237e441d15d535bbf03c0d28220b8252abec33/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4576656e74732e4162737472616374696f6e732e737667"><img src="https://camo.githubusercontent.com/45cf6513823fe0b22a57f67d0e237e441d15d535bbf03c0d28220b8252abec33/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4576656e74732e4162737472616374696f6e732e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Events.Abstractions.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/284934cfd1b27e013a37e80b5c79fb2b3dab32b040d5cc02397a6c1ed72fb764/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4576656e74732e4162737472616374696f6e732e737667"><img src="https://camo.githubusercontent.com/284934cfd1b27e013a37e80b5c79fb2b3dab32b040d5cc02397a6c1ed72fb764/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4576656e74732e4162737472616374696f6e732e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Events.Abstractions.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Events</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/0b0f6275ac4e671b773ee615818f83e10d11bc02f4ca7def6d995798f5249725/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4576656e74732e737667"><img src="https://camo.githubusercontent.com/0b0f6275ac4e671b773ee615818f83e10d11bc02f4ca7def6d995798f5249725/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4576656e74732e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Events.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/84b23c4cbe9c37677efd1b94feccdf518d07e7ee16fe607ece03bcd6ac9ae35f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4576656e74732e737667"><img src="https://camo.githubusercontent.com/84b23c4cbe9c37677efd1b94feccdf518d07e7ee16fe607ece03bcd6ac9ae35f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4576656e74732e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Events.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Events.MediatR</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/07e8ae9bdc7d38c03b5b70316865a76c1b8d24d204d164121f106472d1c5bc1a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4576656e74732e4d6564696174522e737667"><img src="https://camo.githubusercontent.com/07e8ae9bdc7d38c03b5b70316865a76c1b8d24d204d164121f106472d1c5bc1a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4576656e74732e4d6564696174522e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Events.MediatR.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/8659a6ec5766e9b72d9745b9ec735441803477e27b21dc62116116991a2371b3/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4576656e74732e4d6564696174522e737667"><img src="https://camo.githubusercontent.com/8659a6ec5766e9b72d9745b9ec735441803477e27b21dc62116116991a2371b3/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4576656e74732e4d6564696174522e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Events.MediatR.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Templates</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/59cc67ec5f6004586d2a7980f40508022f8d70c74c8361127ced191dd9a04aed/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e54656d706c617465732e737667"><img src="https://camo.githubusercontent.com/59cc67ec5f6004586d2a7980f40508022f8d70c74c8361127ced191dd9a04aed/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e54656d706c617465732e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Templates.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/8846836a968527f25e227c127d064ae7dd953172ef515cfa31fbc849d9434b39/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e54656d706c617465732e737667"><img src="https://camo.githubusercontent.com/8846836a968527f25e227c127d064ae7dd953172ef515cfa31fbc849d9434b39/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e54656d706c617465732e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Templates.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Templates.Razor</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/41f0948c2250d7ab22a8bff04c1bdf33af6e1614cfc6a6c9fc6cc13057b3094f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e54656d706c617465732e52617a6f722e737667"><img src="https://camo.githubusercontent.com/41f0948c2250d7ab22a8bff04c1bdf33af6e1614cfc6a6c9fc6cc13057b3094f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e54656d706c617465732e52617a6f722e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Templates.Razor.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/d61062d67ee4f5ac5bc7e665ec9f6b59842db3bb7b0b91eed38c2fd6c2739ced/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e54656d706c617465732e52617a6f722e737667"><img src="https://camo.githubusercontent.com/d61062d67ee4f5ac5bc7e665ec9f6b59842db3bb7b0b91eed38c2fd6c2739ced/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e54656d706c617465732e52617a6f722e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Templates.Razor.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Templates.Handlebars</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/cb5371c13521eb65de9cc9424c149578b0ca1297a4b1e8fdc761c0d2cd9a39c9/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e54656d706c617465732e48616e646c65626172732e737667"><img src="https://camo.githubusercontent.com/cb5371c13521eb65de9cc9424c149578b0ca1297a4b1e8fdc761c0d2cd9a39c9/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e54656d706c617465732e48616e646c65626172732e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Templates.Handlebars.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/0989936e1d15cce8d69ad87f609a4f6d14aa4bfa0500fed9a4062b88d49d1161/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e54656d706c617465732e48616e646c65626172732e737667"><img src="https://camo.githubusercontent.com/0989936e1d15cce8d69ad87f609a4f6d14aa4bfa0500fed9a4062b88d49d1161/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e54656d706c617465732e48616e646c65626172732e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Templates.Handlebars.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Caching</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/e6053a5f31f4001038299fb8cade17d4ba97ef9dfe8ca5e72e2e9d3403ba71f6/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e43616368696e672e737667"><img src="https://camo.githubusercontent.com/e6053a5f31f4001038299fb8cade17d4ba97ef9dfe8ca5e72e2e9d3403ba71f6/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e43616368696e672e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Caching.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/20a9ba8d838ee804835307d466eb10f13c5a7b41a24c71dc1c34cbb577d84c7a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e43616368696e672e737667"><img src="https://camo.githubusercontent.com/20a9ba8d838ee804835307d466eb10f13c5a7b41a24c71dc1c34cbb577d84c7a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e43616368696e672e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Caching.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Caching.EasyCaching</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/21032afcdd8a227f39795856cc66dfe8261210c814f6873ae7dc10bbfa4dc4c4/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e43616368696e672e4561737943616368696e672e737667"><img src="https://camo.githubusercontent.com/21032afcdd8a227f39795856cc66dfe8261210c814f6873ae7dc10bbfa4dc4c4/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e43616368696e672e4561737943616368696e672e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Caching.EasyCaching.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/706c5abc50e8387ecdbb19dfc56051006c6296f29dc4330588755929b320bf04/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e43616368696e672e4561737943616368696e672e737667"><img src="https://camo.githubusercontent.com/706c5abc50e8387ecdbb19dfc56051006c6296f29dc4330588755929b320bf04/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e43616368696e672e4561737943616368696e672e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Caching.EasyCaching.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Scheduling</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/3a6254a9a11170b4dfe0f12a6ea360b11b9806b2c09b8f5466a21f91c2ce43f9/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e5363686564756c696e672e737667"><img src="https://camo.githubusercontent.com/3a6254a9a11170b4dfe0f12a6ea360b11b9806b2c09b8f5466a21f91c2ce43f9/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e5363686564756c696e672e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Scheduling.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/0c88bd9cfecb065a44a57139da84e78f8a92b63786169d59b06e3e6f6270d0b0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e5363686564756c696e672e737667"><img src="https://camo.githubusercontent.com/0c88bd9cfecb065a44a57139da84e78f8a92b63786169d59b06e3e6f6270d0b0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e5363686564756c696e672e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Scheduling.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Scheduling.Quartz</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/0074a0a011506906357fff075f2389fc92203825786e9dc55e63f05df7782667/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e5363686564756c696e672e51756172747a2e737667"><img src="https://camo.githubusercontent.com/0074a0a011506906357fff075f2389fc92203825786e9dc55e63f05df7782667/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e5363686564756c696e672e51756172747a2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Scheduling.Quartz.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/af8485ddf1c75f683047d939797f769091c5b08af327a41468c33a70c919aa61/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e5363686564756c696e672e51756172747a2e737667"><img src="https://camo.githubusercontent.com/af8485ddf1c75f683047d939797f769091c5b08af327a41468c33a70c919aa61/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e5363686564756c696e672e51756172747a2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Scheduling.Quartz.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Scheduling.Hangfire</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/249ef0a471fb905311070f3898cfa515d64a621bcd25d21d6758026cce897feb/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e5363686564756c696e672e48616e67666972652e737667"><img src="https://camo.githubusercontent.com/249ef0a471fb905311070f3898cfa515d64a621bcd25d21d6758026cce897feb/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e5363686564756c696e672e48616e67666972652e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Scheduling.Hangfire.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/e6198828927e1d90c3a6251aac2673be495d605de13ac9ec0e98fead0bb82421/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e5363686564756c696e672e48616e67666972652e737667"><img src="https://camo.githubusercontent.com/e6198828927e1d90c3a6251aac2673be495d605de13ac9ec0e98fead0bb82421/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e5363686564756c696e672e48616e67666972652e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Scheduling.Hangfire.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Images.ImageSharp</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/b54f0323a7f6eecf3f873796bd18a007d6907663992073db1388685d17c94481/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e496d616765732e496d61676553686172702e737667"><img src="https://camo.githubusercontent.com/b54f0323a7f6eecf3f873796bd18a007d6907663992073db1388685d17c94481/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e496d616765732e496d61676553686172702e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Images.ImageSharp.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/bc09e39035a7e99ce186718f461995acbcef0d03534bc3a1da92a4a252fd0075/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e496d616765732e496d61676553686172702e737667"><img src="https://camo.githubusercontent.com/bc09e39035a7e99ce186718f461995acbcef0d03534bc3a1da92a4a252fd0075/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e496d616765732e496d61676553686172702e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Images.ImageSharp.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Images.Avatar</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/6e7b3cbdc6219202afda1d05b89c8e842f8206602f89bb0f3dff6a2f4f862c69/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e496d616765732e4176617461722e737667"><img src="https://camo.githubusercontent.com/6e7b3cbdc6219202afda1d05b89c8e842f8206602f89bb0f3dff6a2f4f862c69/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e496d616765732e4176617461722e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Images.Avatar.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/2c5b881ba8d015c7eb13d3163d19524709c1415e5d99adc6a5def54c5af68a75/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e496d616765732e4176617461722e737667"><img src="https://camo.githubusercontent.com/2c5b881ba8d015c7eb13d3163d19524709c1415e5d99adc6a5def54c5af68a75/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e496d616765732e4176617461722e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Images.Avatar.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.FileStorage.Abstractions</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/f339d80af3da0704af8386071bca933b4a578bf5ae6806a6c82850a3229c4074/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e46696c6553746f726167652e4162737472616374696f6e732e737667"><img src="https://camo.githubusercontent.com/f339d80af3da0704af8386071bca933b4a578bf5ae6806a6c82850a3229c4074/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e46696c6553746f726167652e4162737472616374696f6e732e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.FileStorage.Abstractions.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/e2cee84c0f0b11f44353e61c27a70f1ac91b60d1f45bfe4ed81eabcf6ccab4f4/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e46696c6553746f726167652e4162737472616374696f6e732e737667"><img src="https://camo.githubusercontent.com/e2cee84c0f0b11f44353e61c27a70f1ac91b60d1f45bfe4ed81eabcf6ccab4f4/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e46696c6553746f726167652e4162737472616374696f6e732e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.FileStorage.Abstractions.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.FileStorage</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/5722f854737fd568166e83e2d7e9759dc3e6dc2c8730a3bd33f269d5ab19d52a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e46696c6553746f726167652e737667"><img src="https://camo.githubusercontent.com/5722f854737fd568166e83e2d7e9759dc3e6dc2c8730a3bd33f269d5ab19d52a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e46696c6553746f726167652e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.FileStorage.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/8c92f02fde78c1fbb9cd5245dbc4beb4cddec3df400c27eb3d603dc910b0845a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e46696c6553746f726167652e737667"><img src="https://camo.githubusercontent.com/8c92f02fde78c1fbb9cd5245dbc4beb4cddec3df400c27eb3d603dc910b0845a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e46696c6553746f726167652e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.FileStorage.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.FileStorage.Minio</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/bc734264ddff1611c2f8ad73c4e6c770012b69f39af3b5e3c28f37fd1f25160a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e46696c6553746f726167652e4d696e696f2e737667"><img src="https://camo.githubusercontent.com/bc734264ddff1611c2f8ad73c4e6c770012b69f39af3b5e3c28f37fd1f25160a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e46696c6553746f726167652e4d696e696f2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.FileStorage.Minio.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/519e735b2c75971ee648fea0dd3816d9e51829b3e617079d4fd171190709e668/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e46696c6553746f726167652e4d696e696f2e737667"><img src="https://camo.githubusercontent.com/519e735b2c75971ee648fea0dd3816d9e51829b3e617079d4fd171190709e668/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e46696c6553746f726167652e4d696e696f2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.FileStorage.Minio.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.FileStorage.Aliyun</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/2d6a9c26d152a773d512b10b33d392e2fd7b903541c0c516796d108dfb55884f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e46696c6553746f726167652e416c6979756e2e737667"><img src="https://camo.githubusercontent.com/2d6a9c26d152a773d512b10b33d392e2fd7b903541c0c516796d108dfb55884f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e46696c6553746f726167652e416c6979756e2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.FileStorage.Aliyun.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/8877e58caad39cb5122dd2c7dc0640115d807a9e71a8e810da6c135e118806b0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e46696c6553746f726167652e416c6979756e2e737667"><img src="https://camo.githubusercontent.com/8877e58caad39cb5122dd2c7dc0640115d807a9e71a8e810da6c135e118806b0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e46696c6553746f726167652e416c6979756e2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.FileStorage.Aliyun.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.FileStorage.All</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/963198782a823d56ea42b2f1f04bdb5d6d543b4dced671fc840ca0cdaa5d46d8/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e46696c6553746f726167652e416c6c2e737667"><img src="https://camo.githubusercontent.com/963198782a823d56ea42b2f1f04bdb5d6d543b4dced671fc840ca0cdaa5d46d8/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e46696c6553746f726167652e416c6c2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.FileStorage.All.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/18dcd42f9a6443e3d02fffd335c14fa74a4f31048984582ff7ad1f62e56633db/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e46696c6553746f726167652e416c6c2e737667"><img src="https://camo.githubusercontent.com/18dcd42f9a6443e3d02fffd335c14fa74a4f31048984582ff7ad1f62e56633db/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e46696c6553746f726167652e416c6c2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.FileStorage.All.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Tenants.Abstractions</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/08c4427d3297cd0122f7063e44dd3c909512bdcd016b44d2af09b0d6c9b76054/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e54656e616e74732e4162737472616374696f6e732e737667"><img src="https://camo.githubusercontent.com/08c4427d3297cd0122f7063e44dd3c909512bdcd016b44d2af09b0d6c9b76054/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e54656e616e74732e4162737472616374696f6e732e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Tenants.Abstractions.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/991b8494cf3713019b6cbdb22e61e228a73e72a89c027a3e7ddf08f9cb7eaec9/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e54656e616e74732e4162737472616374696f6e732e737667"><img src="https://camo.githubusercontent.com/991b8494cf3713019b6cbdb22e61e228a73e72a89c027a3e7ddf08f9cb7eaec9/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e54656e616e74732e4162737472616374696f6e732e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Tenants.Abstractions.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Tenants</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/5f4fdac9a9555a3f83ab3887ade7fd9650f078a2be2ebfb8b34bf6413f9c484a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e54656e616e74732e737667"><img src="https://camo.githubusercontent.com/5f4fdac9a9555a3f83ab3887ade7fd9650f078a2be2ebfb8b34bf6413f9c484a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e54656e616e74732e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Tenants.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/7d8535fe66a92414b9fcaa6ac072aca471851ac5ff9d87474dbd509a5b537c38/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e54656e616e74732e737667"><img src="https://camo.githubusercontent.com/7d8535fe66a92414b9fcaa6ac072aca471851ac5ff9d87474dbd509a5b537c38/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e54656e616e74732e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Tenants.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Domain</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/8844480837d8267b58f8d5b610475d918ce97248d7c6c45c8690f084fbc27038/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446f6d61696e2e737667"><img src="https://camo.githubusercontent.com/8844480837d8267b58f8d5b610475d918ce97248d7c6c45c8690f084fbc27038/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446f6d61696e2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Domain.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/80d0798e1c952ec050650b3a4b3b32b9285cfb3547ab66bee67f42f29c9ae050/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446f6d61696e2e737667"><img src="https://camo.githubusercontent.com/80d0798e1c952ec050650b3a4b3b32b9285cfb3547ab66bee67f42f29c9ae050/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446f6d61696e2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Domain.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Domain.Biz</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/becf91998bb11c9d6cd00b183cafe58c957f85e173f798475188d0c45b83ac41/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446f6d61696e2e42697a2e737667"><img src="https://camo.githubusercontent.com/becf91998bb11c9d6cd00b183cafe58c957f85e173f798475188d0c45b83ac41/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446f6d61696e2e42697a2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Domain.Biz.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/16d3bcfae10080cfcb05ad6da39cb65b552db30af511817a42bd9bd71a227c36/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446f6d61696e2e42697a2e737667"><img src="https://camo.githubusercontent.com/16d3bcfae10080cfcb05ad6da39cb65b552db30af511817a42bd9bd71a227c36/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446f6d61696e2e42697a2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Domain.Biz.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Data.Core</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/1391032ec11feb4e09de0a5df0f203afc629a2a45eb1260884c598b605a478f2/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e436f72652e737667"><img src="https://camo.githubusercontent.com/1391032ec11feb4e09de0a5df0f203afc629a2a45eb1260884c598b605a478f2/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e436f72652e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Data.Core.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/cc749c2de2ae2ac6e446e6cde3cf9f4ea54ca6651872161d1572b7b44df89c4d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e436f72652e737667"><img src="https://camo.githubusercontent.com/cc749c2de2ae2ac6e446e6cde3cf9f4ea54ca6651872161d1572b7b44df89c4d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e436f72652e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Data.Core.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Data.Sql</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/bf5ad0d744a0c5ccca075238e9b862f258eeef2620b0273dd05f47879d6a0d51/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e53716c2e737667"><img src="https://camo.githubusercontent.com/bf5ad0d744a0c5ccca075238e9b862f258eeef2620b0273dd05f47879d6a0d51/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e53716c2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Data.Sql.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/1a17cb7701ce23ea04eb30c1735f485acb369351716cabf0f10befc1d352e62f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e53716c2e737667"><img src="https://camo.githubusercontent.com/1a17cb7701ce23ea04eb30c1735f485acb369351716cabf0f10befc1d352e62f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e53716c2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Data.Sql.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Data.Metadata</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/00d66eaa8c07f739ac8accfd0670bd8206f17968ddfcc76e19e9d642dd9e801c/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4d657461646174612e737667"><img src="https://camo.githubusercontent.com/00d66eaa8c07f739ac8accfd0670bd8206f17968ddfcc76e19e9d642dd9e801c/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4d657461646174612e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Data.Metadata.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/eb18973229039c7efdeef3a82df8722af2a583e78ec324aa6d9b49f762f35e45/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4d657461646174612e737667"><img src="https://camo.githubusercontent.com/eb18973229039c7efdeef3a82df8722af2a583e78ec324aa6d9b49f762f35e45/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4d657461646174612e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Data.Metadata.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Data.EntityFrameworkCore</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/3e1e877bb8fdb6b929adfcbecd5bdfd4d09c811b50a5f926bfde42254178b00e/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e456e746974794672616d65776f726b436f72652e737667"><img src="https://camo.githubusercontent.com/3e1e877bb8fdb6b929adfcbecd5bdfd4d09c811b50a5f926bfde42254178b00e/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e456e746974794672616d65776f726b436f72652e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Data.EntityFrameworkCore.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/624d80e3d13e949e6b023367781abe99d91b0dc4bd4fc649063b6001d7f4d0a2/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e456e746974794672616d65776f726b436f72652e737667"><img src="https://camo.githubusercontent.com/624d80e3d13e949e6b023367781abe99d91b0dc4bd4fc649063b6001d7f4d0a2/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e456e746974794672616d65776f726b436f72652e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Data.EntityFrameworkCore.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Data.EntityFrameworkCore.SqlServer</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/a0c9995c20d1364895c2f87ea60806e2d13a0c6de046e06b3e4d27d16fec5384/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e456e746974794672616d65776f726b436f72652e53716c5365727665722e737667"><img src="https://camo.githubusercontent.com/a0c9995c20d1364895c2f87ea60806e2d13a0c6de046e06b3e4d27d16fec5384/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e456e746974794672616d65776f726b436f72652e53716c5365727665722e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Data.EntityFrameworkCore.SqlServer.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/5d7843ead98e4accff1a785f088892437baeea9c2d4feea27d45be7ec706a295/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e456e746974794672616d65776f726b436f72652e53716c5365727665722e737667"><img src="https://camo.githubusercontent.com/5d7843ead98e4accff1a785f088892437baeea9c2d4feea27d45be7ec706a295/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e456e746974794672616d65776f726b436f72652e53716c5365727665722e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Data.EntityFrameworkCore.SqlServer.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Data.EntityFrameworkCore.PostgreSql</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/71d1a59a3261014751991f9c66ff546a54b9923b5bdd6287e0a82bb354701e9c/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e456e746974794672616d65776f726b436f72652e506f737467726553716c2e737667"><img src="https://camo.githubusercontent.com/71d1a59a3261014751991f9c66ff546a54b9923b5bdd6287e0a82bb354701e9c/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e456e746974794672616d65776f726b436f72652e506f737467726553716c2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Data.EntityFrameworkCore.PostgreSql.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/d3265ccc8e37e138ac34e87590f2038ffeaa3f3a0b15740528bd0f6101457b3a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e456e746974794672616d65776f726b436f72652e506f737467726553716c2e737667"><img src="https://camo.githubusercontent.com/d3265ccc8e37e138ac34e87590f2038ffeaa3f3a0b15740528bd0f6101457b3a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e456e746974794672616d65776f726b436f72652e506f737467726553716c2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Data.EntityFrameworkCore.PostgreSql.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Data.EntityFrameworkCore.MySql</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4bbbb9e76be1b505b340656e3d526bbd18d30e41475516bb73f1a301b671d200/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e456e746974794672616d65776f726b436f72652e4d7953716c2e737667"><img src="https://camo.githubusercontent.com/4bbbb9e76be1b505b340656e3d526bbd18d30e41475516bb73f1a301b671d200/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e456e746974794672616d65776f726b436f72652e4d7953716c2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Data.EntityFrameworkCore.MySql.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/9cfa161dd100f5b4d590d4655d0bf1a11aaddc242fd956d318be83ce91adce2e/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e456e746974794672616d65776f726b436f72652e4d7953716c2e737667"><img src="https://camo.githubusercontent.com/9cfa161dd100f5b4d590d4655d0bf1a11aaddc242fd956d318be83ce91adce2e/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e456e746974794672616d65776f726b436f72652e4d7953716c2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Data.EntityFrameworkCore.MySql.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Data.EntityFrameworkCore.Sqlite</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/1acad7ebe8c95fc783e18d0a281cbba8415d5e9c3fd69599f5c608ec9253008b/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e456e746974794672616d65776f726b436f72652e53716c6974652e737667"><img src="https://camo.githubusercontent.com/1acad7ebe8c95fc783e18d0a281cbba8415d5e9c3fd69599f5c608ec9253008b/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e456e746974794672616d65776f726b436f72652e53716c6974652e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Data.EntityFrameworkCore.Sqlite.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4e0759603f7be76ea58263094e715318c6307506853aad9fc73fdbc9f1d9a9e3/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e456e746974794672616d65776f726b436f72652e53716c6974652e737667"><img src="https://camo.githubusercontent.com/4e0759603f7be76ea58263094e715318c6307506853aad9fc73fdbc9f1d9a9e3/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e456e746974794672616d65776f726b436f72652e53716c6974652e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Data.EntityFrameworkCore.Sqlite.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Data.EntityFrameworkCore.Oracle</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/d87d1600b1bc5d0551339cdbc86fbc59abd3a79500cd5be4094ad68ee06f7c55/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e456e746974794672616d65776f726b436f72652e4f7261636c652e737667"><img src="https://camo.githubusercontent.com/d87d1600b1bc5d0551339cdbc86fbc59abd3a79500cd5be4094ad68ee06f7c55/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e456e746974794672616d65776f726b436f72652e4f7261636c652e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Data.EntityFrameworkCore.Oracle.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/0d3b320e4a4720bbe57d0e9209b013fde6b723f879f12dcc7c34346dfaccf4fa/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e456e746974794672616d65776f726b436f72652e4f7261636c652e737667"><img src="https://camo.githubusercontent.com/0d3b320e4a4720bbe57d0e9209b013fde6b723f879f12dcc7c34346dfaccf4fa/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e456e746974794672616d65776f726b436f72652e4f7261636c652e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Data.EntityFrameworkCore.Oracle.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Data.Dapper.Core</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/fc5a255184ac770493ca85deabcaaf0d35349c64fbeb3592371fc5c75dbb1a7e/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4461707065722e436f72652e737667"><img src="https://camo.githubusercontent.com/fc5a255184ac770493ca85deabcaaf0d35349c64fbeb3592371fc5c75dbb1a7e/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4461707065722e436f72652e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Data.Dapper.Core.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/d87d5bbe93e679bc6b3f4f8c446f721414303f9a5827bf492576a9cc38c9b49d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4461707065722e436f72652e737667"><img src="https://camo.githubusercontent.com/d87d5bbe93e679bc6b3f4f8c446f721414303f9a5827bf492576a9cc38c9b49d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4461707065722e436f72652e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Data.Dapper.Core.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Data.Dapper.SqlServer</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/9b831a40933459092dc8c668e303954567541d2a12f8dabfc522466cb18f05ab/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4461707065722e53716c5365727665722e737667"><img src="https://camo.githubusercontent.com/9b831a40933459092dc8c668e303954567541d2a12f8dabfc522466cb18f05ab/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4461707065722e53716c5365727665722e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Data.Dapper.SqlServer.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/cb0795c7a14454c9692bb52d390980a741dfef4b2f338cfb67d2088af08ad901/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4461707065722e53716c5365727665722e737667"><img src="https://camo.githubusercontent.com/cb0795c7a14454c9692bb52d390980a741dfef4b2f338cfb67d2088af08ad901/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4461707065722e53716c5365727665722e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Data.Dapper.SqlServer.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Data.Dapper.PostgreSql</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/26462b0f79904b4eb0cfe2e19d6994e06b562872a608705dfa887f2f7799972f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4461707065722e506f737467726553716c2e737667"><img src="https://camo.githubusercontent.com/26462b0f79904b4eb0cfe2e19d6994e06b562872a608705dfa887f2f7799972f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4461707065722e506f737467726553716c2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Data.Dapper.PostgreSql.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/cbe648061306831c9f38ebde59d12e77be049d634ab671266513b533efc3b002/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4461707065722e506f737467726553716c2e737667"><img src="https://camo.githubusercontent.com/cbe648061306831c9f38ebde59d12e77be049d634ab671266513b533efc3b002/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4461707065722e506f737467726553716c2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Data.Dapper.PostgreSql.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Data.Dapper.MySql</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/aa259427f2de54316b6fad5b5ba7b08f7324b5e65ad89b085df8b56b4325ee5d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4461707065722e4d7953716c2e737667"><img src="https://camo.githubusercontent.com/aa259427f2de54316b6fad5b5ba7b08f7324b5e65ad89b085df8b56b4325ee5d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4461707065722e4d7953716c2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Data.Dapper.MySql.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/3858b905dc99e4700c7127fb97f61c8dd00888ffd0fcad389c2663cc70d8e468/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4461707065722e4d7953716c2e737667"><img src="https://camo.githubusercontent.com/3858b905dc99e4700c7127fb97f61c8dd00888ffd0fcad389c2663cc70d8e468/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4461707065722e4d7953716c2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Data.Dapper.MySql.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Data.Dapper.All</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/f8ecf9613b326d245518e5396678c4b7334b4f2bda861e44a7dd9679209b877c/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4461707065722e416c6c2e737667"><img src="https://camo.githubusercontent.com/f8ecf9613b326d245518e5396678c4b7334b4f2bda861e44a7dd9679209b877c/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e446174612e4461707065722e416c6c2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Data.Dapper.All.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/b87a1bb404cb78e6084e4f77387a970758e067b55925178017313cb2d9d8081a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4461707065722e416c6c2e737667"><img src="https://camo.githubusercontent.com/b87a1bb404cb78e6084e4f77387a970758e067b55925178017313cb2d9d8081a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e446174612e4461707065722e416c6c2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Data.Dapper.All.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Application</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/a46bd2bda8f22e14ec1625c680a29da3ad77a7c16f8c46f31c711f92263e277a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4170706c69636174696f6e2e737667"><img src="https://camo.githubusercontent.com/a46bd2bda8f22e14ec1625c680a29da3ad77a7c16f8c46f31c711f92263e277a/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4170706c69636174696f6e2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Application.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/af357fb1d4063a82c09171d285d16a513f39fd14ec43f265a2250eab1e1a8797/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4170706c69636174696f6e2e737667"><img src="https://camo.githubusercontent.com/af357fb1d4063a82c09171d285d16a513f39fd14ec43f265a2250eab1e1a8797/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4170706c69636174696f6e2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Application.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Application.EntityFrameworkCore</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/56fea58295ee8643400b6804c265af0b06451b2c50c3e47ce720dfff9160dcd0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4170706c69636174696f6e2e456e746974794672616d65776f726b436f72652e737667"><img src="https://camo.githubusercontent.com/56fea58295ee8643400b6804c265af0b06451b2c50c3e47ce720dfff9160dcd0/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4170706c69636174696f6e2e456e746974794672616d65776f726b436f72652e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Application.EntityFrameworkCore.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/debb22e6d74562d541eb98cb7087f16bb30d678d3dbc8e513e74f35b9b804025/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4170706c69636174696f6e2e456e746974794672616d65776f726b436f72652e737667"><img src="https://camo.githubusercontent.com/debb22e6d74562d541eb98cb7087f16bb30d678d3dbc8e513e74f35b9b804025/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4170706c69636174696f6e2e456e746974794672616d65776f726b436f72652e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Application.EntityFrameworkCore.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Application.WebApi</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/10aadb0ce9c9f1cfc06bc5ada37d12c5efcec14b93f515113cc373555342c597/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4170706c69636174696f6e2e5765624170692e737667"><img src="https://camo.githubusercontent.com/10aadb0ce9c9f1cfc06bc5ada37d12c5efcec14b93f515113cc373555342c597/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4170706c69636174696f6e2e5765624170692e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Application.WebApi.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/b2c52d4b958ec3d4cc983707ca47c21cdbd4357739fff2df3bb3d46bd2eda0ac/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4170706c69636174696f6e2e5765624170692e737667"><img src="https://camo.githubusercontent.com/b2c52d4b958ec3d4cc983707ca47c21cdbd4357739fff2df3bb3d46bd2eda0ac/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4170706c69636174696f6e2e5765624170692e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Application.WebApi.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Microservices</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/6a18c4b00982d65b919f1db70d32c46666998c98c5e6d41613d6507b725586f5/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4d6963726f73657276696365732e737667"><img src="https://camo.githubusercontent.com/6a18c4b00982d65b919f1db70d32c46666998c98c5e6d41613d6507b725586f5/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4d6963726f73657276696365732e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Microservices.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/097c4641e277828d8bbed828b8b9e08658fdc51c2b2a139709f059ca0d35a843/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4d6963726f73657276696365732e737667"><img src="https://camo.githubusercontent.com/097c4641e277828d8bbed828b8b9e08658fdc51c2b2a139709f059ca0d35a843/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4d6963726f73657276696365732e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Microservices.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Microservices.Polly</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/a9ab5d21f9a34acdc7885e0a0eadacb7f237d82b529a6d0ed2e5fa79fc53838d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4d6963726f73657276696365732e506f6c6c792e737667"><img src="https://camo.githubusercontent.com/a9ab5d21f9a34acdc7885e0a0eadacb7f237d82b529a6d0ed2e5fa79fc53838d/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4d6963726f73657276696365732e506f6c6c792e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Microservices.Polly.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/57e263d3ea9f87792d0eedafc6658bb89377f806bed89a00109e069eddbaaf8b/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4d6963726f73657276696365732e506f6c6c792e737667"><img src="https://camo.githubusercontent.com/57e263d3ea9f87792d0eedafc6658bb89377f806bed89a00109e069eddbaaf8b/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4d6963726f73657276696365732e506f6c6c792e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Microservices.Polly.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Microservices.Dapr</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/978342916aa7f2c2eaa055af1e9227c82551434fadf080fe5ee3da6e856078d9/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4d6963726f73657276696365732e446170722e737667"><img src="https://camo.githubusercontent.com/978342916aa7f2c2eaa055af1e9227c82551434fadf080fe5ee3da6e856078d9/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4d6963726f73657276696365732e446170722e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Microservices.Dapr.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/7bb2060c616d0f5f48f0860f167b01522bed2b60a5746e5358d1957ee85a337c/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4d6963726f73657276696365732e446170722e737667"><img src="https://camo.githubusercontent.com/7bb2060c616d0f5f48f0860f167b01522bed2b60a5746e5358d1957ee85a337c/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4d6963726f73657276696365732e446170722e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Microservices.Dapr.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Microservices.HealthChecks</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/54794a7a0299fde233b449247b1f88773d587ccb35b828a4e5af9e328b4e13b9/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4d6963726f73657276696365732e4865616c7468436865636b732e737667"><img src="https://camo.githubusercontent.com/54794a7a0299fde233b449247b1f88773d587ccb35b828a4e5af9e328b4e13b9/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e4d6963726f73657276696365732e4865616c7468436865636b732e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Microservices.HealthChecks.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/ccd658e55cf13e5292fb31d4897863cc5ed10c577e38b58acbb9714db02e2f53/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4d6963726f73657276696365732e4865616c7468436865636b732e737667"><img src="https://camo.githubusercontent.com/ccd658e55cf13e5292fb31d4897863cc5ed10c577e38b58acbb9714db02e2f53/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e4d6963726f73657276696365732e4865616c7468436865636b732e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Microservices.HealthChecks.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Ui</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/49d06d019e683f7dbc829d138ffd44bf170072049719d00b9fce762ca98e481b/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e55692e737667"><img src="https://camo.githubusercontent.com/49d06d019e683f7dbc829d138ffd44bf170072049719d00b9fce762ca98e481b/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e55692e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Ui.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/174d11d8267da7d09dfc2bf7ecd6e257ebaf0cf1751824dda0f65569cbc6b881/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e55692e737667"><img src="https://camo.githubusercontent.com/174d11d8267da7d09dfc2bf7ecd6e257ebaf0cf1751824dda0f65569cbc6b881/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e55692e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Ui.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Ui.Angular</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4e9815cb6c1b7fd309b62ba33b202bf503b5de4672c4266d4f7f09e382c2d537/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e55692e416e67756c61722e737667"><img src="https://camo.githubusercontent.com/4e9815cb6c1b7fd309b62ba33b202bf503b5de4672c4266d4f7f09e382c2d537/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e55692e416e67756c61722e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Ui.Angular.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/6f5318f4318b051f767d2aba4f40bf90bf24915bf96751d768fad907e304a77c/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e55692e416e67756c61722e737667"><img src="https://camo.githubusercontent.com/6f5318f4318b051f767d2aba4f40bf90bf24915bf96751d768fad907e304a77c/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e55692e416e67756c61722e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Ui.Angular.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Ui.NgZorro</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/5dbcc37599a8a4adae215a47dc3b6fca60744b96d19dcc0707a255f636c6f512/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e55692e4e675a6f72726f2e737667"><img src="https://camo.githubusercontent.com/5dbcc37599a8a4adae215a47dc3b6fca60744b96d19dcc0707a255f636c6f512/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e55692e4e675a6f72726f2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Ui.NgZorro.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/05fc2239ae047222d2b502e6eeb0a4edb814d13cd7f1a2bcc76debe717c74196/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e55692e4e675a6f72726f2e737667"><img src="https://camo.githubusercontent.com/05fc2239ae047222d2b502e6eeb0a4edb814d13cd7f1a2bcc76debe717c74196/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e55692e4e675a6f72726f2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Ui.NgZorro.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Ui.NgAlain</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/850d2c1ac72983ba6e675857a34f57add04f09681460d7842d4239bb2590a233/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e55692e4e67416c61696e2e737667"><img src="https://camo.githubusercontent.com/850d2c1ac72983ba6e675857a34f57add04f09681460d7842d4239bb2590a233/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e55692e4e67416c61696e2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Ui.NgAlain.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/cb27c30342c780dd76ae8dd9333e75217e7b07a5ff32e49683d21ec801eb3a9f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e55692e4e67416c61696e2e737667"><img src="https://camo.githubusercontent.com/cb27c30342c780dd76ae8dd9333e75217e7b07a5ff32e49683d21ec801eb3a9f/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e55692e4e67416c61696e2e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Ui.NgAlain.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Generators</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/d851b07415c181795c17f503a771c2c00de93d5adf3cbf4476277204b18f67ca/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e47656e657261746f72732e737667"><img src="https://camo.githubusercontent.com/d851b07415c181795c17f503a771c2c00de93d5adf3cbf4476277204b18f67ca/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e47656e657261746f72732e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Generators.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/b7e6c019c99cfc835cd29b3cd2b92e0fe55a401c780c48d082b33ea1c14638d3/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e47656e657261746f72732e737667"><img src="https://camo.githubusercontent.com/b7e6c019c99cfc835cd29b3cd2b92e0fe55a401c780c48d082b33ea1c14638d3/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e47656e657261746f72732e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Generators.svg" style="max-width: 100%;"></a></td> </tr> <tr> <td>Util.Generators.Razor</td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/920768f38525da52573cff92917122c88b7efa01cc99041a403af74bc6d33143/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e47656e657261746f72732e52617a6f722e737667"><img src="https://camo.githubusercontent.com/920768f38525da52573cff92917122c88b7efa01cc99041a403af74bc6d33143/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f5574696c2e47656e657261746f72732e52617a6f722e737667" alt="" data-canonical-src="https://img.shields.io/nuget/v/Util.Generators.Razor.svg" style="max-width: 100%;"></a></td> <td><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c1ae6afee849a5fe942a70f36bedb4f3c62452d969b38e4e6e5b74e076e81cdb/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e47656e657261746f72732e52617a6f722e737667"><img src="https://camo.githubusercontent.com/c1ae6afee849a5fe942a70f36bedb4f3c62452d969b38e4e6e5b74e076e81cdb/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f64742f5574696c2e47656e657261746f72732e52617a6f722e737667" alt="" data-canonical-src="https://img.shields.io/nuget/dt/Util.Generators.Razor.svg" style="max-width: 100%;"></a></td> </tr> </tbody> </table></markdown-accessiblity-table> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Npm包</h3><a id="user-content-npm包" class="anchor" aria-label="Permalink: Npm包" href="#npm包"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"><strong>util-angular</strong> <a href="https://www.npmjs.org/package/util-angular" rel="nofollow"><img src="https://camo.githubusercontent.com/f67fa6889a48a05ba3d01b9b8a4432cdd7a3c6e397fc04861e2966f6255be723/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f7574696c2d616e67756c61722e7376673f7374796c653d666c61742d737175617265" alt="npm package" data-canonical-src="https://img.shields.io/npm/v/util-angular.svg?style=flat-square" style="max-width: 100%;"></a> <a href="https://npmjs.org/package/util-angular" rel="nofollow"><img src="https://camo.githubusercontent.com/f0362e9b80da463e45b53310b159be0482050c242fd245faa5bc8cb4444be37b/687474703a2f2f696d672e736869656c64732e696f2f6e706d2f646d2f7574696c2d616e67756c61722e7376673f7374796c653d666c61742d737175617265" alt="NPM downloads" data-canonical-src="http://img.shields.io/npm/dm/util-angular.svg?style=flat-square" style="max-width: 100%;"></a></p> </article></div></div></div></div></div> <!-- --> <!-- --> <script type="application/json" id="__PRIMER_DATA_:R0:__">{"resolvedServerColorMode":"day"}</script></div> </react-partial> <input type="hidden" data-csrf="true" value="5g/p/gEuJZCDBzGPRd91dKSmn7iY9N7k5l53HpW55uyF1i1U51qsx5EngCPn6fEtQZSkSMdK8nXxVdccnNJTcQ==" /> </div> <div data-view-component="true" class="Layout-sidebar"> <div class="BorderGrid about-margin" data-pjax> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <div class="hide-sm hide-md"> <h2 class="mb-3 h4">About</h2> <p class="f4 my-3"> Util是一个.Net平台下的应用框架,旨在提升中小团队的开发能力,由工具类、分层架构基类、Ui组件,配套代码生成模板,权限等组成。 </p> <h3 class="sr-only">Topics</h3> <div class="my-3"> <div class="f6"> <a href="/topics/angular" title="Topic: angular" data-view-component="true" class="topic-tag topic-tag-link"> angular </a> <a href="/topics/framework" title="Topic: framework" data-view-component="true" class="topic-tag topic-tag-link"> framework </a> <a href="/topics/aspnetcore" title="Topic: aspnetcore" data-view-component="true" class="topic-tag topic-tag-link"> aspnetcore </a> <a href="/topics/dotnetcore" title="Topic: dotnetcore" data-view-component="true" class="topic-tag topic-tag-link"> dotnetcore </a> <a href="/topics/taghelper" title="Topic: taghelper" data-view-component="true" class="topic-tag topic-tag-link"> taghelper </a> <a href="/topics/efcore" title="Topic: efcore" data-view-component="true" class="topic-tag topic-tag-link"> efcore </a> <a href="/topics/ng-zorro" title="Topic: ng-zorro" data-view-component="true" class="topic-tag topic-tag-link"> ng-zorro </a> </div> </div> <h3 class="sr-only">Resources</h3> <div class="mt-2"> <a class="Link--muted" data-analytics-event="{"category":"Repository Overview","action":"click","label":"location:sidebar;file:readme"}" href="#readme-ov-file"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book mr-2"> <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path> </svg> Readme </a> </div> <h3 class="sr-only">License</h3> <div class="mt-2"> <a href="#MIT-1-ov-file" class="Link--muted" data-analytics-event="{"category":"Repository Overview","action":"click","label":"location:sidebar;file:license"}" > <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-law mr-2"> <path d="M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z"></path> </svg> MIT license </a> </div> <include-fragment src="/dotnetcore/Util/hovercards/citation/sidebar_partial?tree_name=master"> </include-fragment> <div class="mt-2"> <a href="/dotnetcore/Util/activity" data-view-component="true" class="Link Link--muted"><svg text="gray" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pulse mr-2"> <path d="M6 2c.306 0 .582.187.696.471L10 10.731l1.304-3.26A.751.751 0 0 1 12 7h3.25a.75.75 0 0 1 0 1.5h-2.742l-1.812 4.528a.751.751 0 0 1-1.392 0L6 4.77 4.696 8.03A.75.75 0 0 1 4 8.5H.75a.75.75 0 0 1 0-1.5h2.742l1.812-4.529A.751.751 0 0 1 6 2Z"></path> </svg> <span class="color-fg-muted">Activity</span></a> </div> <div class="mt-2"> <a href="/dotnetcore/Util/custom-properties" data-view-component="true" class="Link Link--muted"><svg text="gray" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-note mr-2"> <path d="M0 3.75C0 2.784.784 2 1.75 2h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 14H1.75A1.75 1.75 0 0 1 0 12.25Zm1.75-.25a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-8.5a.25.25 0 0 0-.25-.25ZM3.5 6.25a.75.75 0 0 1 .75-.75h7a.75.75 0 0 1 0 1.5h-7a.75.75 0 0 1-.75-.75Zm.75 2.25h4a.75.75 0 0 1 0 1.5h-4a.75.75 0 0 1 0-1.5Z"></path> </svg> <span class="color-fg-muted">Custom properties</span></a> </div> <h3 class="sr-only">Stars</h3> <div class="mt-2"> <a href="/dotnetcore/Util/stargazers" data-view-component="true" class="Link Link--muted"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star mr-2"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg> <strong>4.6k</strong> stars</a> </div> <h3 class="sr-only">Watchers</h3> <div class="mt-2"> <a href="/dotnetcore/Util/watchers" data-view-component="true" class="Link Link--muted"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-eye mr-2"> <path d="M8 2c1.981 0 3.671.992 4.933 2.078 1.27 1.091 2.187 2.345 2.637 3.023a1.62 1.62 0 0 1 0 1.798c-.45.678-1.367 1.932-2.637 3.023C11.67 13.008 9.981 14 8 14c-1.981 0-3.671-.992-4.933-2.078C1.797 10.83.88 9.576.43 8.898a1.62 1.62 0 0 1 0-1.798c.45-.677 1.367-1.931 2.637-3.022C4.33 2.992 6.019 2 8 2ZM1.679 7.932a.12.12 0 0 0 0 .136c.411.622 1.241 1.75 2.366 2.717C5.176 11.758 6.527 12.5 8 12.5c1.473 0 2.825-.742 3.955-1.715 1.124-.967 1.954-2.096 2.366-2.717a.12.12 0 0 0 0-.136c-.412-.621-1.242-1.75-2.366-2.717C10.824 4.242 9.473 3.5 8 3.5c-1.473 0-2.825.742-3.955 1.715-1.124.967-1.954 2.096-2.366 2.717ZM8 10a2 2 0 1 1-.001-3.999A2 2 0 0 1 8 10Z"></path> </svg> <strong>367</strong> watching</a> </div> <h3 class="sr-only">Forks</h3> <div class="mt-2"> <a href="/dotnetcore/Util/forks" data-view-component="true" class="Link Link--muted"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-2"> <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path> </svg> <strong>1.3k</strong> forks</a> </div> <div class="mt-2"> <a class="Link--muted" href="/contact/report-content?content_url=https%3A%2F%2Fgithub.com%2Fdotnetcore%2FUtil&report=dotnetcore+%28user%29"> Report repository </a> </div> </div> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame"> <a href="/dotnetcore/Util/releases" data-view-component="true" class="Link--primary no-underline Link">Releases <span title="16" data-view-component="true" class="Counter">16</span></a></h2> <a class="Link--primary d-flex no-underline" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/dotnetcore/Util/releases/tag/8.0.19"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-tag flex-shrink-0 mt-1 color-fg-success"> <path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path> </svg> <div class="ml-2 min-width-0"> <div class="d-flex"> <span class="css-truncate css-truncate-target text-bold mr-2" style="max-width: none;">8.0.19 (2024-7-1)</span> <span title="Label: Latest" data-view-component="true" class="Label Label--success flex-shrink-0"> Latest </span> </div> <div class="text-small color-fg-muted"><relative-time datetime="2024-07-01T03:35:53Z" class="no-wrap">Jul 1, 2024</relative-time></div> </div> </a> <div data-view-component="true" class="mt-3"> <a text="small" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/dotnetcore/Util/releases" data-view-component="true" class="Link">+ 15 releases</a></div> </div> </div> <div class="BorderGrid-row" hidden> <div class="BorderGrid-cell"> <include-fragment src="/dotnetcore/Util/used_by_list" accept="text/fragment+html"> </include-fragment> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3"> <a href="/dotnetcore/Util/graphs/contributors" data-view-component="true" class="Link--primary no-underline Link d-flex flex-items-center">Contributors <span title="9" data-view-component="true" class="Counter ml-1">9</span></a></h2> <include-fragment src="/dotnetcore/Util/contributors_list?count=9&current_repository=Util&items_to_show=9" aria-busy="true" aria-label="Loading contributors"> <ul class="list-style-none d-flex flex-wrap mb-n2"> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> <li class="mb-2 "> <div class="Skeleton avatar avatar-user mr-2" style="width:32px;height:32px;"></div> </li> </ul> </include-fragment> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3">Languages</h2> <div class="mb-2"> <span data-view-component="true" class="Progress"> <span style="background-color:#178600 !important;;width: 100.0%;" itemprop="keywords" data-view-component="true" class="Progress-item color-bg-success-emphasis"></span> </span></div> <ul class="list-style-none"> <li class="d-inline"> <a class="d-inline-flex flex-items-center flex-nowrap Link--secondary no-underline text-small mr-3" href="/dotnetcore/Util/search?l=c%23" data-ga-click="Repository, language stats search click, location:repo overview"> <svg style="color:#178600;" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill mr-2"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> <span class="color-fg-default text-bold mr-1">C#</span> <span>100.0%</span> </a> </li> </ul> </div> </div> </div> </div> </div></div> </div> </div> </turbo-frame> </main> </div> </div> <footer class="footer pt-8 pb-6 f6 color-fg-muted p-responsive" role="contentinfo" > <h2 class='sr-only'>Footer</h2> <div class="d-flex flex-justify-center flex-items-center flex-column-reverse flex-lg-row flex-wrap flex-lg-nowrap"> <div class="d-flex flex-items-center flex-shrink-0 mx-2"> <a aria-label="Homepage" title="GitHub" class="footer-octicon mr-2" href="https://github.com"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-mark-github"> <path d="M12 1C5.9225 1 1 5.9225 1 12C1 16.8675 4.14875 20.9787 8.52125 22.4362C9.07125 22.5325 9.2775 22.2025 9.2775 21.9137C9.2775 21.6525 9.26375 20.7862 9.26375 19.865C6.5 20.3737 5.785 19.1912 5.565 18.5725C5.44125 18.2562 4.905 17.28 4.4375 17.0187C4.0525 16.8125 3.5025 16.3037 4.42375 16.29C5.29 16.2762 5.90875 17.0875 6.115 17.4175C7.105 19.0812 8.68625 18.6137 9.31875 18.325C9.415 17.61 9.70375 17.1287 10.02 16.8537C7.5725 16.5787 5.015 15.63 5.015 11.4225C5.015 10.2262 5.44125 9.23625 6.1425 8.46625C6.0325 8.19125 5.6475 7.06375 6.2525 5.55125C6.2525 5.55125 7.17375 5.2625 9.2775 6.67875C10.1575 6.43125 11.0925 6.3075 12.0275 6.3075C12.9625 6.3075 13.8975 6.43125 14.7775 6.67875C16.8813 5.24875 17.8025 5.55125 17.8025 5.55125C18.4075 7.06375 18.0225 8.19125 17.9125 8.46625C18.6138 9.23625 19.04 10.2125 19.04 11.4225C19.04 15.6437 16.4688 16.5787 14.0213 16.8537C14.42 17.1975 14.7638 17.8575 14.7638 18.8887C14.7638 20.36 14.75 21.5425 14.75 21.9137C14.75 22.2025 14.9563 22.5462 15.5063 22.4362C19.8513 20.9787 23 16.8537 23 12C23 5.9225 18.0775 1 12 1Z"></path> </svg> </a> <span> © 2025 GitHub, Inc. </span> </div> <nav aria-label="Footer"> <h3 class="sr-only" id="sr-footer-heading">Footer navigation</h3> <ul class="list-style-none d-flex flex-justify-center flex-wrap mb-2 mb-lg-0" aria-labelledby="sr-footer-heading"> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to Terms","label":"text:terms"}" href="https://docs.github.com/site-policy/github-terms/github-terms-of-service" data-view-component="true" class="Link--secondary Link">Terms</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to privacy","label":"text:privacy"}" href="https://docs.github.com/site-policy/privacy-policies/github-privacy-statement" data-view-component="true" class="Link--secondary Link">Privacy</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to security","label":"text:security"}" href="https://github.com/security" data-view-component="true" class="Link--secondary Link">Security</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to status","label":"text:status"}" href="https://www.githubstatus.com/" data-view-component="true" class="Link--secondary Link">Status</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to docs","label":"text:docs"}" href="https://docs.github.com/" data-view-component="true" class="Link--secondary Link">Docs</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to contact","label":"text:contact"}" href="https://support.github.com?tags=dotcom-footer" data-view-component="true" class="Link--secondary Link">Contact</a> </li> <li class="mx-2" > <cookie-consent-link> <button type="button" class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent" data-action="click:cookie-consent-link#showConsentManagement" data-analytics-event="{"location":"footer","action":"cookies","context":"subfooter","tag":"link","label":"cookies_link_subfooter_footer"}" > Manage cookies </button> </cookie-consent-link> </li> <li class="mx-2"> <cookie-consent-link> <button type="button" class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent" data-action="click:cookie-consent-link#showConsentManagement" data-analytics-event="{"location":"footer","action":"dont_share_info","context":"subfooter","tag":"link","label":"dont_share_info_link_subfooter_footer"}" > Do not share my personal information </button> </cookie-consent-link> </li> </ul> </nav> </div> </footer> <ghcc-consent id="ghcc" class="position-fixed bottom-0 left-0" style="z-index: 999999" data-initial-cookie-consent-allowed="" data-cookie-consent-required="false"></ghcc-consent> <div id="ajax-error-message" class="ajax-error-message flash flash-error" hidden> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert"> <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <button type="button" class="flash-close js-ajax-error-dismiss" aria-label="Dismiss error"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> You can’t perform that action at this time. </div> <template id="site-details-dialog"> <details class="details-reset details-overlay details-overlay-dark lh-default color-fg-default hx_rsm" open> <summary role="button" aria-label="Close dialog"></summary> <details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast hx_rsm-dialog hx_rsm-modal"> <button class="Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0" type="button" aria-label="Close dialog" data-close-dialog> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> <div class="octocat-spinner my-6 js-details-dialog-spinner"></div> </details-dialog> </details> </template> <div class="Popover js-hovercard-content position-absolute" style="display: none; outline: none;"> <div class="Popover-message Popover-message--bottom-left Popover-message--large Box color-shadow-large" style="width:360px;"> </div> </div> <template id="snippet-clipboard-copy-button"> <div class="zeroclipboard-container position-absolute right-0 top-0"> <clipboard-copy aria-label="Copy" class="ClipboardButton btn js-clipboard-copy m-2 p-0" data-copy-feedback="Copied!" data-tooltip-direction="w"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon m-2"> <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2"> <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path> </svg> </clipboard-copy> </div> </template> <template id="snippet-clipboard-copy-button-unpositioned"> <div class="zeroclipboard-container"> <clipboard-copy aria-label="Copy" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon"> <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none"> <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path> </svg> </clipboard-copy> </div> </template> </div> <div id="js-global-screen-reader-notice" class="sr-only mt-n1" aria-live="polite" aria-atomic="true" ></div> <div id="js-global-screen-reader-notice-assertive" class="sr-only mt-n1" aria-live="assertive" aria-atomic="true"></div> </body> </html>