Skip to content

Commit 104f66e

Browse files
authored
Merge pull request #16 from Infarh/dev
v0.0.6 - Обновление пакетов (до .NET10)
2 parents 04bab95 + e682788 commit 104f66e

File tree

10 files changed

+223
-44
lines changed

10 files changed

+223
-44
lines changed

.github/copilot-instructions.md

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# Правила для GitHub Copilot
2+
3+
- Всегда отвечай, используя русский язык
4+
- Всегда пиши комментарии в коде на русском языке
5+
6+
## Комментарии
7+
- Короткие пояснительные комментарии располагай в конце той же строки, что и код // кратко по делу
8+
- Старайся избегать тривиальных комментариев
9+
10+
## XML‑документация
11+
- Документируй классы, структуры, делегаты, перечисления и их члены только XML‑комментариями
12+
- Одинарное предложение пиши в одной строке внутри тега и без точки в конце
13+
- Каждый тег XML‑комментария располагай на отдельной строке
14+
- Порядок тегов: `<summary>``<param>``<returns>``<exception>``<remarks>``<example>`
15+
- Для сложных публичных метдов генерируй блок с простым примером использования кода внутри тега `<example>`
16+
17+
Примеры:
18+
- `<summary>Краткое описание сущности</summary>`
19+
- `<param name="Value">Описание параметра</param>`
20+
- `<returns>Описание возвращаемого значения</returns>`
21+
22+
## Синтаксис и минимализм
23+
- При генерации кода используй современные конструкции языка, совместимые с целевыми платформами проекта
24+
- Стремись минимизировать количество фигурных скобок за счёт expression‑bodied членов и switch‑выражений
25+
- Не убирай фигурные скобки в многострочных конструкциях ради читаемости
26+
- Всегда старайся минимизировать размер кода, если не запрошено иное
27+
28+
Разрешённые современные приёмы (когда поддерживается целевой платформой):
29+
- file‑scoped namespace
30+
- expression‑bodied члены
31+
- switch‑выражения и pattern matching
32+
- target‑typed `new`
33+
- collection expressions и инициализаторы коллекций
34+
- `using var` и `await using`
35+
- операторы `??`, `??=`, `is not`, `with`
36+
- упрощение nullable-присвоения `target?.Property = 15;` вместо `if(target is not null) target.Property = 15;`
37+
38+
## Именование
39+
- Локальные переменные: `snake_case`
40+
- Параметры методов: `PascalCase`
41+
- Поля экземпляров: `_PascalCase`
42+
- Статические поля: `__PascalCase`
43+
- Константы: `PascalCase`
44+
- Публичные типы и члены API: `PascalCase`
45+
- Предпочитай английский язык при именовании переменных, методов, классов и прочих сущностей
46+
47+
## Инициализация и объявления
48+
- При инициализации массивов, списков и словарей используй выражения инициализации массивов/коллекций
49+
- При объявлении переменных предпочитай использовать ключевое слово `var` (кроме случаев, когда явный тип заметно повышает понятность)
50+
51+
## Форматирование
52+
- Короткие системные комментарии пиши компактно в одну строку
53+
- Удаляй неиспользуемые `using`, сортируй и группируй директивы `using`
54+
- Разделяй логические блоки пустыми строками по мере необходимости, избегай лишних переносов
55+
56+
## Практики .NET
57+
- Включай `#nullable enable` там, где это поддерживается
58+
- Используй guard‑выражения, например `ArgumentNullException.ThrowIfNull(x)`
59+
- Предпочитай Try‑паттерны для контроля потока вместо исключений
60+
- При генерации метода добавляй в его начале блок проверки входных параметров. Отделяй этот блок пустой строкой от остального тела метода
61+
- При генерации публичных свойств у моделей-представления MVVM (классов, реализующих INotifyPropertyChanged) используй следующий формат (в одну строку):
62+
```csharp
63+
/// <summary>Описание свойства</summary>
64+
public string PropertyName { get; set => Set(ref field, value); }
65+
```
66+
- Для простых лаконичных методов используй expression‑bodied синтаксис, записанный в одну строку.
67+
68+
## Совместимость целей
69+
- В рабочем пространстве используются целевые платформы: `.NET Standard 2.0` и `.NET 10`
70+
- Применяй современные возможности языка и платформы только если они доступны для соответствующей целевой платформы проекта

.github/workflows/publish.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ jobs:
3434
- name: Setup .NET
3535
uses: actions/setup-dotnet@v4
3636
with:
37-
dotnet-version: 9.0.x
37+
dotnet-version: 10.0.x
3838

3939
- name: Cache NuGet
4040
uses: actions/cache@v3
@@ -76,7 +76,7 @@ jobs:
7676
- name: Install .NET Core
7777
uses: actions/setup-dotnet@v3
7878
with:
79-
dotnet-version: 8.0.x
79+
dotnet-version: 10.0.x
8080

8181
- name: Get artifact
8282
uses: actions/download-artifact@v4.1.8
@@ -97,7 +97,7 @@ jobs:
9797
- name: Install .NET Core
9898
uses: actions/setup-dotnet@v3
9999
with:
100-
dotnet-version: 8.0.x
100+
dotnet-version: 10.0.x
101101

102102
- name: Get artifact
103103
uses: actions/download-artifact@v4.1.8

.github/workflows/testing.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
- name: Setup .NET
2020
uses: actions/setup-dotnet@v4
2121
with:
22-
dotnet-version: 9.0.x
22+
dotnet-version: 10.0.x
2323

2424
- name: Cache NuGet
2525
uses: actions/cache@v3

MathCore.Hosting.sln

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
3-
# Visual Studio Version 16
4-
VisualStudioVersion = 16.0.31019.35
3+
# Visual Studio Version 18
4+
VisualStudioVersion = 18.0.11205.157 d18.0
55
MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MathCore.Hosting", "MathCore.Hosting\MathCore.Hosting.csproj", "{C798853D-64B1-4B61-A0CE-38BFCACC23AB}"
77
EndProject
@@ -11,7 +11,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestWPF", "Tests\TestWPF\Te
1111
EndProject
1212
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".Common", ".Common", "{870FFA8A-5793-40CF-AF67-199F6CC51250}"
1313
ProjectSection(SolutionItems) = preProject
14+
.github\copilot-instructions.md = .github\copilot-instructions.md
15+
.github\workflows\publish.yml = .github\workflows\publish.yml
1416
ReadMe.md = ReadMe.md
17+
.github\workflows\testing.yml = .github\workflows\testing.yml
1518
EndProjectSection
1619
EndProject
1720
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MathCore.Hosting.Tests", "Tests\MathCore.Hosting.Tests\MathCore.Hosting.Tests.csproj", "{8890CFAF-9629-4686-B8C5-B41C693D295F}"
Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,30 @@
1-
using System;
2-
using System.ComponentModel;
1+
//using System;
2+
//using System.ComponentModel;
33

4-
namespace MathCore.Hosting;
4+
//namespace MathCore.Hosting;
55

6-
public class DynamicPropertyManager<T> : IDisposable
7-
{
8-
private DynamicTypeDescriptionProvider _Provider;
9-
private class DynamicTypeDescriptionProvider : TypeDescriptionProvider
10-
{
6+
//public class DynamicPropertyManager<T> : IDisposable
7+
//{
8+
// private readonly DynamicTypeDescriptionProvider _Provider;
119

12-
}
10+
// private class DynamicTypeDescriptionProvider : TypeDescriptionProvider;
1311

14-
public DynamicPropertiesCollection<T> Properties { get; } = new();
12+
// public DynamicPropertiesCollection<T> Properties { get; } = new();
1513

16-
public DynamicPropertyManager() => TypeDescriptor.AddProvider(_Provider = new DynamicTypeDescriptionProvider(), typeof(T));
14+
// public DynamicPropertyManager() => TypeDescriptor.AddProvider(_Provider = new(), typeof(T));
1715

18-
public void Dispose() => TypeDescriptor.RemoveProvider(_Provider, typeof(T));
19-
}
16+
// public void Dispose() => TypeDescriptor.RemoveProvider(_Provider, typeof(T));
17+
//}
2018

21-
public class DynamicPropertiesCollection<T>
22-
{
23-
private class DynamicPropertyDescriptor<TProperty>
24-
{
19+
//public class DynamicPropertiesCollection<T>
20+
//{
21+
// private class DynamicPropertyDescriptor<TProperty>
22+
// {
2523

26-
}
24+
// }
2725

28-
public void Add<TProperty>(string Name, Func<TProperty> Getter, Action<TProperty>? Setter = null, Attribute[]? Attributes = null)
29-
{
26+
// public void Add<TProperty>(string Name, Func<TProperty> Getter, Action<TProperty>? Setter = null, Attribute[]? Attributes = null)
27+
// {
3028

31-
}
32-
}
29+
// }
30+
//}

MathCore.Hosting/MathCore.Hosting.csproj

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>netstandard2.0</TargetFramework>
4+
<TargetFrameworks>
5+
net8.0;
6+
net9.0;
7+
net10.0;
8+
netstandard2.0
9+
</TargetFrameworks>
510
<LangVersion>preview</LangVersion>
611
<Nullable>enable</Nullable>
712
<ImplicitUsings>enable</ImplicitUsings>
813
</PropertyGroup>
914

1015
<PropertyGroup>
11-
<Version>0.0.5.1</Version>
16+
<Version>0.0.6</Version>
1217
<PackageReleaseNotes>
1318
Функциональность регистрации сервисов выделена в отдельный пакет MathCore.DI
1419
</PackageReleaseNotes>
@@ -36,8 +41,8 @@
3641
</PropertyGroup>
3742

3843
<ItemGroup>
39-
<PackageReference Include="MathCore.DI" Version="0.0.3.1" />
40-
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.1" />
44+
<PackageReference Include="MathCore.DI" Version="0.0.4" />
45+
<PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.0" />
4146
<PackageReference Include="System.Reflection.Emit" Version="4.7.0" />
4247
</ItemGroup>
4348

MathCore.Hosting/ServiceLocator.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@
44

55
namespace MathCore.Hosting;
66

7+
/// <summary>Базовый локатор сервисов с доступом к зависимостям через dynamic</summary>
78
public abstract class ServiceLocator : DynamicObject
89
{
10+
/// <summary>Заполняет внутренний кэш доступных сервисов на основе текущих регистраций</summary>
11+
/// <param name="services">Коллекция сервисов DI</param>
12+
/// <remarks>При совпадении имён типов берётся первая регистрация</remarks>
913
public static void ConfigureServices(IServiceCollection services)
1014
{
1115
var result = new Dictionary<string, (Type? Type, Func<IServiceProvider, object>? Factory)>();
@@ -19,12 +23,19 @@ public static void ConfigureServices(IServiceCollection services)
1923
__Services = result;
2024
}
2125

26+
/// <summary>Кэш соответствий имён сервисов их типам или фабрикам</summary>
2227
private static Dictionary<string, (Type? Type, Func<IServiceProvider, object>? Factory)> __Services = new();
2328

29+
/// <summary>Провайдер сервисов, используемый локатором для разрешения зависимостей</summary>
2430
protected abstract IServiceProvider Services { get; }
2531

26-
/// <inheritdoc />
27-
public override bool TryGetMember(GetMemberBinder binder, out object result)
32+
/// <summary>Пытается получить сервис по имени динамического члена</summary>
33+
/// <param name="binder">Объект привязки динамического члена</param>
34+
/// <param name="result">Найденный экземпляр сервиса или null</param>
35+
/// <returns>Истина, если сервис получен успешно</returns>
36+
/// <exception cref="InvalidOperationException">Если тип найден, но экземпляр не может быть разрешён контейнером</exception>
37+
/// <remarks>Сначала используется фабрика реализации, затем тип и провайдер сервисов</remarks>
38+
public override bool TryGetMember(GetMemberBinder binder, out object? result)
2839
{
2940
if (base.TryGetMember(binder, out result))
3041
return true;
@@ -42,5 +53,7 @@ public override bool TryGetMember(GetMemberBinder binder, out object result)
4253
return true;
4354
}
4455

56+
/// <summary>Возвращает имена доступных динамических членов</summary>
57+
/// <returns>Перечень имён сервисов, доступных через локатор</returns>
4558
public override IEnumerable<string> GetDynamicMemberNames() => __Services.Keys;
4659
}

0 commit comments

Comments
 (0)