Skip to content

Commit a7189dd

Browse files
authored
v0.0.3.1 - Обновление пакетов
v0.0.3.1 - Обновление пакетов
2 parents 8c867a0 + ba5488c commit a7189dd

18 files changed

+149
-77
lines changed

MathCore.DI/ComplexInjectionRegistrator.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ private static ServiceDescriptor CreateDescriptor(this Type Service, Type? Imple
101101
.Select(property => (property, Inject: property.GetCustomAttributes().FirstOrDefault(a => a.GetType().Name == "InjectAttribute")))
102102
.Where(p => p.Inject is not null)
103103
// Выбираем те свойства, у которых есть атрибут [Inject]
104-
.Select(p =>
104+
.Select(MemberBinding (p) =>
105105
{
106106
var (property, inject) = p;
107107
var required = (inject as InjectAttribute)?.Required
@@ -113,7 +113,7 @@ private static ServiceDescriptor CreateDescriptor(this Type Service, Type? Imple
113113
? Expression.Call(get_required_service, sp, type)
114114
: Expression.Call(sp, get_service, type);
115115
var value = Expression.Convert(obj, property_type); // Полученный объект приводим к property_type
116-
return (MemberBinding)Expression.Bind(property, value); // Формируем выражение, выполняющее привязку полученного значения к свойству
116+
return Expression.Bind(property, value); // Формируем выражение, выполняющее привязку полученного значения к свойству
117117
})
118118
.ToArray();
119119

@@ -122,7 +122,7 @@ private static ServiceDescriptor CreateDescriptor(this Type Service, Type? Imple
122122
.Concat(service_type.GetFields(inst_no_public))
123123
.Select(field => (property: field, Inject: field.GetCustomAttributes().FirstOrDefault(a => a.GetType().Name == "InjectAttribute")))
124124
.Where(p => p.Inject is not null)
125-
.Select(f =>
125+
.Select(MemberBinding (f) =>
126126
{
127127
var (field, inject) = f;
128128
var required = (inject as InjectAttribute)?.Required
@@ -134,7 +134,7 @@ private static ServiceDescriptor CreateDescriptor(this Type Service, Type? Imple
134134
? Expression.Call(get_required_service, sp, type)
135135
: Expression.Call(sp, get_service, type);
136136
var value = Expression.Convert(obj, field_type); // Полученный объект приводим к property_type
137-
return (MemberBinding)Expression.Bind(field, value); // Формируем выражение, выполняющее привязку полученного значения к полю
137+
return Expression.Bind(field, value); // Формируем выражение, выполняющее привязку полученного значения к полю
138138
})
139139
.ToArray();
140140

@@ -154,7 +154,7 @@ private static ServiceDescriptor CreateDescriptor(this Type Service, Type? Imple
154154
var methods = service_type.GetMethods(inst_public)
155155
.Concat(service_type.GetMethods(inst_no_public))
156156
.Where(InitMethod => InitMethod.GetCustomAttribute<InjectAttribute>() != null) // где есть атрибут [Inject]
157-
.Select(InitMethod =>
157+
.Select(Expression (InitMethod) =>
158158
{
159159
var inject = InitMethod.GetCustomAttributes().FirstOrDefault(a => a.GetType().Name == "InjectAttribute");
160160
var method_required = (inject as InjectAttribute)?.Required;
@@ -179,7 +179,7 @@ private static ServiceDescriptor CreateDescriptor(this Type Service, Type? Imple
179179
: Expression.Convert(result, service_type);
180180

181181
// Формируем выражение вызова данного метода с передачей ему полного набора параметров
182-
return (Expression)Expression.Call(service_impl, InitMethod, parameters);
182+
return Expression.Call(service_impl, InitMethod, parameters);
183183
})
184184
.ToArray();
185185

@@ -205,7 +205,7 @@ private static ServiceDescriptor CreateDescriptor(this Type Service, Type? Imple
205205
var factory = factory_expr.Compile()
206206
?? throw new InvalidOperationException("Не удалось выполнить сборку выражения инициализации сервиса");
207207

208-
return new ServiceDescriptor(Service, factory, Mode);
208+
return new(Service, factory, Mode);
209209
}
210210

211211
/// <summary>Добавить сервис с возможностями внедрения зависимости через поля/свойства и методы</summary>
@@ -240,7 +240,7 @@ public static IServiceCollection AddService(this IServiceCollection services, Ty
240240
private static IServiceCollection AddSimple(this IServiceCollection services, Type Service, Type? Implementation, ServiceLifetime Mode)
241241
{
242242
var descriptor = Implementation is null
243-
? new ServiceDescriptor(Service, Service, Mode)
243+
? new(Service, Service, Mode)
244244
: new ServiceDescriptor(Service, Implementation, Mode);
245245

246246
services.TryAdd(descriptor);

MathCore.DI/CompositorRegistrator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public static IServiceCollection AddComposite<TInterface>(this IServiceCollectio
3535
if (interface_type.GetProperties(instance).Any(p => p.GetIndexParameters() is { Length: > 0 }))
3636
throw new InvalidOperationException("В указанном интерфейсе присутствуют индексаторы. Интерфейс может содержать только свойства.");
3737

38-
services.Add(new ServiceDescriptor(interface_type, interface_type.CreateImplementation(), ServiceLifetime));
38+
services.Add(new(interface_type, interface_type.CreateImplementation(), ServiceLifetime));
3939

4040
return services;
4141
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace MathCore.DI.Extensions;
2+
3+
public static class ServicesCollectionEx
4+
{
5+
public static IServiceCollection AddServicesFrom(this IServiceCollection collection, IServiceProvider services)
6+
{
7+
//services.
8+
9+
10+
return collection;
11+
}
12+
}

MathCore.DI/InjectAttribute.cs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,22 @@
11
namespace MathCore.DI;
22

3+
/// <summary>
4+
/// Атрибут, указывающий на необходимость внедрения зависимости.
5+
/// </summary>
6+
/// <remarks>
7+
/// Инициализирует новый экземпляр класса <see cref="InjectAttribute"/> с указанной обязательностью внедрения.
8+
/// </remarks>
9+
/// <param name="Required">Обязательность внедрения зависимости.</param>
310
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Method | AttributeTargets.Parameter)]
4-
public sealed class InjectAttribute : Attribute
11+
public sealed class InjectAttribute(bool Required) : Attribute
512
{
6-
public bool Required { get; set; } = true;
13+
/// <summary>
14+
/// Обязательность внедрения зависимости.
15+
/// </summary>
16+
public bool Required { get; set; } = Required;
717

8-
public InjectAttribute() { }
9-
10-
public InjectAttribute(bool Required) => this.Required = Required;
18+
/// <summary>
19+
/// Инициализирует новый экземпляр класса <see cref="InjectAttribute"/>.
20+
/// </summary>
21+
public InjectAttribute() : this(true) { }
1122
}

MathCore.DI/InterfaceImplementator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public static Type CreateImplementation(this Type InterfaceType)
117117
{
118118
var properties = InterfaceType.GetProperties();
119119

120-
var assembly = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName(Guid.NewGuid().ToString()), AssemblyBuilderAccess.Run);
120+
var assembly = AssemblyBuilder.DefineDynamicAssembly(new(Guid.NewGuid().ToString()), AssemblyBuilderAccess.Run);
121121
var module = assembly.DefineDynamicModule("MathCore.Hosting.Emit");
122122

123123
var composition_type_name = $"MathCore.Hosting.Emit.{InterfaceType.Name.TrimStart('I')}Composition";

MathCore.DI/MathCore.DI.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
</PropertyGroup>
99

1010
<PropertyGroup>
11-
<Version>0.0.3</Version>
11+
<Version>0.0.3.1</Version>
1212
<PackageReleaseNotes>
1313
Добавлена новая реализация атрибута сервиса шаблонного типа
1414
</PackageReleaseNotes>
@@ -36,7 +36,7 @@
3636
</PropertyGroup>
3737

3838
<ItemGroup>
39-
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.0" />
39+
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.1" />
4040
<PackageReference Include="System.Reflection.Emit" Version="4.7.0" PrivateAssets="all" />
4141
</ItemGroup>
4242

MathCore.DI/ServiceAttribute.cs

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,78 @@
11
namespace MathCore.DI;
22

3+
/// <summary>
4+
/// Атрибут, используемый для маркировки класса или интерфейса в качестве сервиса.
5+
/// </summary>
36
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, Inherited = false, AllowMultiple = false)]
47
public class ServiceAttribute : Attribute
58
{
9+
/// <summary>
10+
/// Получает или устанавливает режим временного lifetime сервиса.
11+
/// </summary>
612
public ServiceLifetime Mode { get; set; } = ServiceLifetime.Transient;
713

814
private Type? _Implementation;
915

16+
/// <summary>
17+
/// Получает или устанавливает тип реализации сервиса.
18+
/// </summary>
19+
/// <exception cref="InvalidOperationException">Вызывается, если тип реализации устанавливается после установки интерфейса.</exception>
1020
public Type? Implementation
1121
{
1222
get => _Implementation;
1323
set
1424
{
1525
if (_Interface is not null)
16-
throw new InvalidOperationException("Попытка установить реализацию сервиса при уже указанном значении интерфейса. Реализацией сервиса должен являться класс, к которому применяется данный атрибут.");
26+
throw new InvalidOperationException("Нельзя устанавливать тип реализации после установки интерфейса. Реализацией сервиса должен быть класс.");
1727
_Implementation = value;
1828
}
1929
}
2030

2131
private Type? _Interface;
2232

33+
/// <summary>
34+
/// Получает или устанавливает тип интерфейса сервиса.
35+
/// </summary>
36+
/// <exception cref="InvalidOperationException">Вызывается, если тип интерфейса устанавливается после установки реализации.</exception>
2337
public Type? Interface
2438
{
2539
get => _Interface;
2640
set
2741
{
28-
if(_Implementation is not null)
29-
throw new InvalidOperationException("Попытка установить интерфейс при уже указанной реализации. Интерфейсом должен являться тип, к которому применяется данный интерфейс");
42+
if (_Implementation is not null)
43+
throw new InvalidOperationException("Нельзя устанавливать тип интерфейса после установки реализации. Интерфейсом должен быть тип.");
3044
_Interface = value;
3145
}
3246
}
3347

48+
/// <summary>
49+
/// Инициализирует новый экземпляр класса <see cref="ServiceAttribute"/>.
50+
/// </summary>
3451
public ServiceAttribute() { }
3552

53+
/// <summary>
54+
/// Инициализирует новый экземпляр класса <see cref="ServiceAttribute"/> с указанным режимом временного lifetime.
55+
/// </summary>
56+
/// <param name="Mode">Режим временного lifetime сервиса.</param>
3657
public ServiceAttribute(ServiceLifetime Mode) => this.Mode = Mode;
3758

59+
/// <summary>
60+
/// Деконструирует атрибут сервиса в его части.
61+
/// </summary>
62+
/// <param name="Implementation">Тип реализации сервиса.</param>
63+
/// <param name="Mode">Режим временного lifetime сервиса.</param>
3864
public void Deconstruct(out Type? Implementation, out ServiceLifetime Mode)
3965
{
4066
Implementation = this.Implementation;
4167
Mode = this.Mode;
4268
}
4369

70+
/// <summary>
71+
/// Деконструирует атрибут сервиса в его части.
72+
/// </summary>
73+
/// <param name="Service">Тип интерфейса сервиса.</param>
74+
/// <param name="Implementation">Тип реализации сервиса.</param>
75+
/// <param name="Mode">Режим временного lifetime сервиса.</param>
4476
public void Deconstruct(out Type? Service, out Type? Implementation, out ServiceLifetime Mode)
4577
{
4678
Service = _Interface;

MathCore.DI/ServiceAttributeT.cs

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,27 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Text;
4-
5-
namespace MathCore.DI;
1+
namespace MathCore.DI;
62

3+
/// <summary>
4+
/// Атрибут сервиса, позволяющий указать тип сервиса и его реализацию.
5+
/// </summary>
6+
/// <typeparam name="TService">Тип сервиса.</typeparam>
77
public class ServiceAttribute<TService> : ServiceAttribute
88
where TService : class
99
{
10+
/// <summary>
11+
/// Инициализирует новый экземпляр класса <see cref="ServiceAttribute{TService}"/>.
12+
/// </summary>
1013
public ServiceAttribute() => SetType(typeof(TService));
1114

15+
/// <summary>
16+
/// Инициализирует новый экземпляр класса <see cref="ServiceAttribute{TService}"/> с указанным режимом временного cycle lifetime.
17+
/// </summary>
18+
/// <param name="Mode">Режим временного cycle lifetime сервиса.</param>
1219
public ServiceAttribute(ServiceLifetime Mode) : base(Mode) => SetType(typeof(TService));
1320

21+
/// <summary>
22+
/// Устанавливает тип сервиса и его реализацию.
23+
/// </summary>
24+
/// <param name="ServiceType">Тип сервиса.</param>
1425
private void SetType(Type ServiceType)
1526
{
1627
if (ServiceType.IsInterface)
@@ -20,14 +31,31 @@ private void SetType(Type ServiceType)
2031
}
2132
}
2233

23-
public class ServiceAttribute<TInterface, TService> : ServiceAttribute
34+
/// <summary>
35+
/// Атрибут, используемый для маркировки класса или интерфейса в качестве сервиса.
36+
/// </summary>
37+
/// <typeparam name="TInterface">Тип интерфейса сервиса.</typeparam>
38+
/// <typeparam name="TService">Тип реализации сервиса.</typeparam>
39+
public class ServiceAttribute<TInterface, TService> : ServiceAttribute
2440
where TInterface : class
2541
where TService : class, TInterface
2642
{
43+
/// <summary>
44+
/// Инициализирует новый экземпляр класса <see cref="ServiceAttribute{TInterface, TService}"/>.
45+
/// </summary>
2746
public ServiceAttribute() => SetType(typeof(TInterface), typeof(TService));
2847

48+
/// <summary>
49+
/// Инициализирует новый экземпляр класса <see cref="ServiceAttribute{TInterface, TService}"/> с указанным режимом временного cycle lifetime.
50+
/// </summary>
51+
/// <param name="Mode">Режим временного cycle lifetime сервиса.</param>
2952
public ServiceAttribute(ServiceLifetime Mode) : base(Mode) => SetType(typeof(TInterface), typeof(TService));
3053

54+
/// <summary>
55+
/// Устанавливает тип интерфейса и реализации сервиса.
56+
/// </summary>
57+
/// <param name="InterfaceType">Тип интерфейса сервиса.</param>
58+
/// <param name="ServiceType">Тип реализации сервиса.</param>
3159
private void SetType(Type InterfaceType, Type ServiceType)
3260
{
3361
Interface = InterfaceType;

Tests/ConsoleTests/ConsoleTests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
</ItemGroup>
1919

2020
<ItemGroup>
21-
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.0" />
21+
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.1" />
2222
</ItemGroup>
2323

2424
<ItemGroup>
Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
namespace ConsoleTests.Interfaces
1+
namespace ConsoleTests.Interfaces;
2+
3+
[Service(ServiceLifetime.Singleton, Implementation = typeof(UserDialogService))]
4+
public interface IUserDialog
25
{
3-
[Service(ServiceLifetime.Singleton, Implementation = typeof(UserDialogService))]
4-
public interface IUserDialog
5-
{
66

7-
}
8-
}
7+
}

0 commit comments

Comments
 (0)