-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* ValidateObjectMembersを使ったプロジェクトを追加 * タイミング懸賞のサンプルを未完成状態で一旦登録 * プロジェクト名を変更し、ValidateEnumeratedItemsのサンプルを追加 * thisを追加 * コレクション初期化子を使用するように修正 * Readmeを追加 * URLを修正
- Loading branch information
1 parent
b65bf33
commit b55c37c
Showing
86 changed files
with
75,218 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,231 @@ | ||
# 上位ディレクトリから .editorconfig 設定を継承する場合は、以下の行を削除します | ||
root = true | ||
|
||
# C# ファイル | ||
[*.cs] | ||
|
||
#### コア EditorConfig オプション #### | ||
|
||
# インデントと間隔 | ||
indent_size = 4 | ||
indent_style = space | ||
tab_width = 4 | ||
|
||
# 改行設定 | ||
end_of_line = crlf | ||
insert_final_newline = false | ||
|
||
#### .NET コーディング規則 #### | ||
|
||
# using の整理 | ||
dotnet_separate_import_directive_groups = false | ||
dotnet_sort_system_directives_first = true | ||
file_header_template = unset | ||
|
||
# this. と Me. の設定 | ||
dotnet_style_qualification_for_event = true | ||
dotnet_style_qualification_for_field = true | ||
dotnet_style_qualification_for_method = true | ||
dotnet_style_qualification_for_property = true | ||
|
||
# 言語キーワードと BCL の種類の設定 | ||
dotnet_style_predefined_type_for_locals_parameters_members = true | ||
dotnet_style_predefined_type_for_member_access = true | ||
|
||
# かっこの設定 | ||
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity | ||
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity | ||
dotnet_style_parentheses_in_other_operators = never_if_unnecessary | ||
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity | ||
|
||
# 修飾子設定 | ||
dotnet_style_require_accessibility_modifiers = for_non_interface_members | ||
|
||
# 式レベルの設定 | ||
dotnet_style_coalesce_expression = true | ||
dotnet_style_collection_initializer = true | ||
dotnet_style_explicit_tuple_names = true | ||
dotnet_style_namespace_match_folder = true | ||
dotnet_style_null_propagation = true | ||
dotnet_style_object_initializer = true | ||
dotnet_style_operator_placement_when_wrapping = beginning_of_line | ||
dotnet_style_prefer_auto_properties = true | ||
dotnet_style_prefer_collection_expression = when_types_loosely_match | ||
dotnet_style_prefer_compound_assignment = true | ||
dotnet_style_prefer_conditional_expression_over_assignment = true | ||
dotnet_style_prefer_conditional_expression_over_return = true | ||
dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed | ||
dotnet_style_prefer_inferred_anonymous_type_member_names = true | ||
dotnet_style_prefer_inferred_tuple_names = true | ||
dotnet_style_prefer_is_null_check_over_reference_equality_method = true | ||
dotnet_style_prefer_simplified_boolean_expressions = true | ||
dotnet_style_prefer_simplified_interpolation = true | ||
|
||
# フィールド設定 | ||
dotnet_style_readonly_field = true | ||
|
||
# パラメーターの設定 | ||
dotnet_code_quality_unused_parameters = all | ||
|
||
# 抑制の設定 | ||
dotnet_remove_unnecessary_suppression_exclusions = none | ||
|
||
# 改行設定 | ||
dotnet_style_allow_multiple_blank_lines_experimental = true | ||
dotnet_style_allow_statement_immediately_after_block_experimental = true | ||
|
||
#### C# コーディング規則 #### | ||
|
||
# var を優先 | ||
csharp_style_var_elsewhere = false | ||
csharp_style_var_for_built_in_types = false | ||
csharp_style_var_when_type_is_apparent = false | ||
|
||
# 式のようなメンバー | ||
csharp_style_expression_bodied_accessors = true | ||
csharp_style_expression_bodied_constructors = false | ||
csharp_style_expression_bodied_indexers = true | ||
csharp_style_expression_bodied_lambdas = true | ||
csharp_style_expression_bodied_local_functions = false | ||
csharp_style_expression_bodied_methods = false | ||
csharp_style_expression_bodied_operators = false | ||
csharp_style_expression_bodied_properties = true | ||
|
||
# パターン マッチング設定 | ||
csharp_style_pattern_matching_over_as_with_null_check = true | ||
csharp_style_pattern_matching_over_is_with_cast_check = true | ||
csharp_style_prefer_extended_property_pattern = true | ||
csharp_style_prefer_not_pattern = true | ||
csharp_style_prefer_pattern_matching = true | ||
csharp_style_prefer_switch_expression = true | ||
|
||
# Null チェック設定 | ||
csharp_style_conditional_delegate_call = true | ||
|
||
# 修飾子設定 | ||
csharp_prefer_static_local_function = true | ||
csharp_preferred_modifier_order = public,private,protected,internal,file,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async | ||
csharp_style_prefer_readonly_struct = true | ||
csharp_style_prefer_readonly_struct_member = true | ||
|
||
# コード ブロックの設定 | ||
csharp_prefer_braces = true | ||
csharp_prefer_simple_using_statement = true | ||
csharp_style_namespace_declarations = file_scoped | ||
csharp_style_prefer_method_group_conversion = true | ||
csharp_style_prefer_primary_constructors = true | ||
csharp_style_prefer_top_level_statements = true | ||
|
||
# 式レベルの設定 | ||
csharp_prefer_simple_default_expression = true | ||
csharp_style_deconstructed_variable_declaration = true | ||
csharp_style_implicit_object_creation_when_type_is_apparent = true | ||
csharp_style_inlined_variable_declaration = true | ||
csharp_style_prefer_index_operator = true | ||
csharp_style_prefer_local_over_anonymous_function = true | ||
csharp_style_prefer_null_check_over_type_check = true | ||
csharp_style_prefer_range_operator = true | ||
csharp_style_prefer_tuple_swap = true | ||
csharp_style_prefer_utf8_string_literals = true | ||
csharp_style_throw_expression = true | ||
csharp_style_unused_value_assignment_preference = discard_variable | ||
csharp_style_unused_value_expression_statement_preference = discard_variable | ||
|
||
# 'using' ディレクティブの基本設定 | ||
csharp_using_directive_placement = outside_namespace | ||
|
||
# 改行設定 | ||
csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true | ||
csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true | ||
csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true | ||
csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true | ||
csharp_style_allow_embedded_statements_on_same_line_experimental = true | ||
|
||
#### C# 書式ルール #### | ||
|
||
# 改行設定 | ||
csharp_new_line_before_catch = true | ||
csharp_new_line_before_else = true | ||
csharp_new_line_before_finally = true | ||
csharp_new_line_before_members_in_anonymous_types = true | ||
csharp_new_line_before_members_in_object_initializers = true | ||
csharp_new_line_before_open_brace = all | ||
csharp_new_line_between_query_expression_clauses = true | ||
|
||
# インデント設定 | ||
csharp_indent_block_contents = true | ||
csharp_indent_braces = false | ||
csharp_indent_case_contents = true | ||
csharp_indent_case_contents_when_block = true | ||
csharp_indent_labels = one_less_than_current | ||
csharp_indent_switch_labels = true | ||
|
||
# スペース設定 | ||
csharp_space_after_cast = false | ||
csharp_space_after_colon_in_inheritance_clause = true | ||
csharp_space_after_comma = true | ||
csharp_space_after_dot = false | ||
csharp_space_after_keywords_in_control_flow_statements = true | ||
csharp_space_after_semicolon_in_for_statement = true | ||
csharp_space_around_binary_operators = before_and_after | ||
csharp_space_around_declaration_statements = false | ||
csharp_space_before_colon_in_inheritance_clause = true | ||
csharp_space_before_comma = false | ||
csharp_space_before_dot = false | ||
csharp_space_before_open_square_brackets = false | ||
csharp_space_before_semicolon_in_for_statement = false | ||
csharp_space_between_empty_square_brackets = false | ||
csharp_space_between_method_call_empty_parameter_list_parentheses = false | ||
csharp_space_between_method_call_name_and_opening_parenthesis = false | ||
csharp_space_between_method_call_parameter_list_parentheses = false | ||
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false | ||
csharp_space_between_method_declaration_name_and_open_parenthesis = false | ||
csharp_space_between_method_declaration_parameter_list_parentheses = false | ||
csharp_space_between_parentheses = false | ||
csharp_space_between_square_brackets = false | ||
|
||
# 折り返しの設定 | ||
csharp_preserve_single_line_blocks = true | ||
csharp_preserve_single_line_statements = true | ||
|
||
#### 命名スタイル #### | ||
|
||
# 名前付けルール | ||
|
||
dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion | ||
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface | ||
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i | ||
|
||
dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion | ||
dotnet_naming_rule.types_should_be_pascal_case.symbols = types | ||
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case | ||
|
||
dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion | ||
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members | ||
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case | ||
|
||
# 記号の仕様 | ||
|
||
dotnet_naming_symbols.interface.applicable_kinds = interface | ||
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected | ||
dotnet_naming_symbols.interface.required_modifiers = | ||
|
||
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum | ||
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected | ||
dotnet_naming_symbols.types.required_modifiers = | ||
|
||
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method | ||
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected | ||
dotnet_naming_symbols.non_field_members.required_modifiers = | ||
|
||
# 命名スタイル | ||
|
||
dotnet_naming_style.pascal_case.required_prefix = | ||
dotnet_naming_style.pascal_case.required_suffix = | ||
dotnet_naming_style.pascal_case.word_separator = | ||
dotnet_naming_style.pascal_case.capitalization = pascal_case | ||
|
||
dotnet_naming_style.begins_with_i.required_prefix = I | ||
dotnet_naming_style.begins_with_i.required_suffix = | ||
dotnet_naming_style.begins_with_i.word_separator = | ||
dotnet_naming_style.begins_with_i.capitalization = pascal_case |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
|
||
Microsoft Visual Studio Solution File, Format Version 12.00 | ||
# Visual Studio Version 17 | ||
VisualStudioVersion = 17.0.31903.59 | ||
MinimumVisualStudioVersion = 10.0.40219.1 | ||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{BD843995-F45B-427D-A254-32AF4D66AC14}" | ||
EndProject | ||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OptionsPattern.Web", "src\OptionsPattern.Web\OptionsPattern.Web.csproj", "{44A9CE2D-C31F-4893-A8C1-876E55F34DC2}" | ||
EndProject | ||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ソリューション項目", "ソリューション項目", "{178530AC-7A48-4D42-94B0-4171D7898FB9}" | ||
ProjectSection(SolutionItems) = preProject | ||
README.md = README.md | ||
EndProjectSection | ||
EndProject | ||
Global | ||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||
Debug|Any CPU = Debug|Any CPU | ||
Release|Any CPU = Release|Any CPU | ||
EndGlobalSection | ||
GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||
{44A9CE2D-C31F-4893-A8C1-876E55F34DC2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||
{44A9CE2D-C31F-4893-A8C1-876E55F34DC2}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||
{44A9CE2D-C31F-4893-A8C1-876E55F34DC2}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||
{44A9CE2D-C31F-4893-A8C1-876E55F34DC2}.Release|Any CPU.Build.0 = Release|Any CPU | ||
EndGlobalSection | ||
GlobalSection(SolutionProperties) = preSolution | ||
HideSolutionNode = FALSE | ||
EndGlobalSection | ||
GlobalSection(NestedProjects) = preSolution | ||
{44A9CE2D-C31F-4893-A8C1-876E55F34DC2} = {BD843995-F45B-427D-A254-32AF4D66AC14} | ||
EndGlobalSection | ||
GlobalSection(ExtensibilityGlobals) = postSolution | ||
SolutionGuid = {0CB4181C-A248-4C99-9D3A-B82166D241B2} | ||
EndGlobalSection | ||
EndGlobal |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
## このサンプルについて | ||
|
||
ASP.NET Core のオプションパターンにおいて、設定値の入力値検証を行うサンプルです。 | ||
以下の条件で検証しています。 | ||
|
||
- .NET 8 | ||
- Microsoft.Extensions.Options 8.0.2 | ||
|
||
このサンプルは、入力値検証の実行タイミングと、ネストされているオプションに対する入力値検証を解説する目的で作成されています。 | ||
詳細は以下をご覧ください。 | ||
|
||
<https://tsuna-can.hateblo.jp/entry/2024/06/19/080000> |
22 changes: 22 additions & 0 deletions
22
OptionsPatternValidation/src/OptionsPattern.Web/Configurations/OptionsPatternSettings.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
using System.ComponentModel.DataAnnotations; | ||
using Microsoft.Extensions.Options; | ||
|
||
namespace OptionsPattern.Web.Configurations; | ||
|
||
public class OptionsPatternSettings | ||
{ | ||
public const string ConfigurationSectionName = nameof(OptionsPatternSettings); | ||
|
||
[Required] | ||
public required string Setting1 { get; set; } | ||
|
||
// ネストした設定のクラスに検証属性をつける場合は、 | ||
// 参照元のオプションのクラスに ValidateObjectMembers 属性をつける。 | ||
[ValidateObjectMembers] | ||
public SubSettings SubSettings { get; set; } = new(); | ||
|
||
// ネスト下設定のクラスがリストや配列になる場合は、 | ||
// 参照元のオプションのクラスに ValidateEnumeratedItems 属性をつける。 | ||
[ValidateEnumeratedItems] | ||
public IList<SettingItem> SettingItems { get; set; } = []; | ||
} |
14 changes: 14 additions & 0 deletions
14
...atternValidation/src/OptionsPattern.Web/Configurations/OptionsPatternSettingsValidator.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
using Microsoft.Extensions.Options; | ||
|
||
namespace OptionsPattern.Web.Configurations; | ||
|
||
// OptionsValidator 属性をつけて以下のように実装しておくと、 | ||
// ソースジェネレーターにより検証のためのコードが自動生成される。 | ||
// ValidateObjectMembers 属性や ValidateEnumeratedItems 属性をつけたプロパティがある場合、 | ||
// それらのクラスに対応する IValidateOptions<TOption> クラスは作成しなくてよい。 | ||
// ネスト元のオプションのクラスに対する IValidateOptions<TOption> があれば、 | ||
// その中で使われているクラスの IValidateOptions<TOption> クラスもソースジェネレーターにより生成される。 | ||
[OptionsValidator] | ||
public partial class OptionsPatternSettingsValidator : IValidateOptions<OptionsPatternSettings> | ||
{ | ||
} |
12 changes: 12 additions & 0 deletions
12
OptionsPatternValidation/src/OptionsPattern.Web/Configurations/SettingItem.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
using System.ComponentModel.DataAnnotations; | ||
|
||
namespace OptionsPattern.Web.Configurations; | ||
|
||
public class SettingItem | ||
{ | ||
[Required] | ||
public required string Name { set; get; } | ||
|
||
[Required] | ||
public required string Value { set; get; } | ||
} |
10 changes: 10 additions & 0 deletions
10
OptionsPatternValidation/src/OptionsPattern.Web/Configurations/SubSettings.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
using System.ComponentModel.DataAnnotations; | ||
|
||
namespace OptionsPattern.Web.Configurations; | ||
|
||
public class SubSettings | ||
{ | ||
[Required] | ||
[Range(0, 100)] | ||
public int Level { get; set; } = 0; | ||
} |
29 changes: 29 additions & 0 deletions
29
OptionsPatternValidation/src/OptionsPattern.Web/Controllers/HomeController.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
using System.Diagnostics; | ||
using Microsoft.AspNetCore.Mvc; | ||
using Microsoft.Extensions.Options; | ||
using OptionsPattern.Web.Configurations; | ||
using OptionsPattern.Web.Models; | ||
|
||
namespace OptionsPattern.Web.Controllers; | ||
|
||
public class HomeController(IOptions<OptionsPatternSettings> options) : Controller | ||
{ | ||
public IActionResult Index() | ||
{ | ||
// ASPNETCORE_ENVIRONMENT:SubSettingsIsFail3 または SettingItemIsFail のときは | ||
// DIコンテナーから取得した IOptions<TOption> の Value を参照したときに検証が行われる。 | ||
this.ViewBag.Options = options.Value; | ||
return this.View(); | ||
} | ||
|
||
public IActionResult Privacy() | ||
{ | ||
return this.View(); | ||
} | ||
|
||
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] | ||
public IActionResult Error() | ||
{ | ||
return this.View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? this.HttpContext.TraceIdentifier }); | ||
} | ||
} |
8 changes: 8 additions & 0 deletions
8
OptionsPatternValidation/src/OptionsPattern.Web/Models/ErrorViewModel.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
namespace OptionsPattern.Web.Models; | ||
|
||
public class ErrorViewModel | ||
{ | ||
public string? RequestId { get; set; } | ||
|
||
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); | ||
} |
13 changes: 13 additions & 0 deletions
13
OptionsPatternValidation/src/OptionsPattern.Web/OptionsPattern.Web.csproj
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
<Project Sdk="Microsoft.NET.Sdk.Web"> | ||
|
||
<PropertyGroup> | ||
<TargetFramework>net8.0</TargetFramework> | ||
<Nullable>enable</Nullable> | ||
<ImplicitUsings>enable</ImplicitUsings> | ||
</PropertyGroup> | ||
|
||
<ItemGroup> | ||
<PackageReference Include="Microsoft.Extensions.Options" Version="8.0.2" /> | ||
</ItemGroup> | ||
|
||
</Project> |
Oops, something went wrong.