Отказ от DI и добавление фабрик

This commit is contained in:
2026-01-25 06:01:34 +03:00
parent 6ad7b5dcdb
commit 0e050b452a
7 changed files with 1066 additions and 242 deletions

View File

@@ -2,7 +2,6 @@
using Lattice.Core.DragDrop.Models;
using Lattice.Core.DragDrop.Services;
using Lattice.Core.Geometry;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Threading;
using System.Threading.Tasks;
@@ -59,24 +58,8 @@ public abstract class DragSourceBehaviorBase<TElement> : IDragSource
/// </summary>
/// <value>
/// Экземпляр <see cref="IDragDropService"/>, используемый для управления операциями перетаскивания.
/// При первом обращении выполняется получение сервиса из <see cref="ServiceProvider"/>.
/// </value>
protected IDragDropService DragDropService
{
get
{
if (_dragDropService == null)
{
_dragDropService = ServiceProvider.GetRequiredService<IDragDropService>();
}
return _dragDropService;
}
}
/// <summary>
/// Получает провайдер сервисов для разрешения зависимостей.
/// </summary>
protected IServiceProvider ServiceProvider { get; }
protected IDragDropService DragDropService { get; }
/// <summary>
/// Получает значение, указывающее, выполняется ли в данный момент операция перетаскивания.
@@ -86,13 +69,13 @@ public abstract class DragSourceBehaviorBase<TElement> : IDragSource
/// <summary>
/// Инициализирует новый экземпляр класса <see cref="DragSourceBehaviorBase{TElement}"/>.
/// </summary>
/// <param name="serviceProvider">Провайдер сервисов для разрешения зависимостей.</param>
/// <param name="dragDropService">Сервис перетаскивания.</param>
/// <exception cref="ArgumentNullException">
/// Выбрасывается, когда <paramref name="serviceProvider"/> равен null.
/// Выбрасывается, когда <paramref name="dragDropService"/> равен null.
/// </exception>
protected DragSourceBehaviorBase(IServiceProvider serviceProvider)
protected DragSourceBehaviorBase(IDragDropService dragDropService)
{
ServiceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));
DragDropService = dragDropService ?? throw new ArgumentNullException(nameof(dragDropService));
}
/// <summary>

View File

@@ -2,7 +2,6 @@
using Lattice.Core.DragDrop.Models;
using Lattice.Core.DragDrop.Services;
using Lattice.Core.Geometry;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Threading;
using System.Threading.Tasks;
@@ -76,24 +75,8 @@ public abstract class DropTargetBehaviorBase<TElement> : IDropTarget
/// </summary>
/// <value>
/// Экземпляр <see cref="IDragDropService"/>, используемый для регистрации цели сброса.
/// При первом обращении выполняется получение сервиса из <see cref="ServiceProvider"/>.
/// </value>
protected IDragDropService DragDropService
{
get
{
if (_dragDropService == null)
{
_dragDropService = ServiceProvider.GetRequiredService<IDragDropService>();
}
return _dragDropService;
}
}
/// <summary>
/// Получает провайдер сервисов для разрешения зависимостей.
/// </summary>
protected IServiceProvider ServiceProvider { get; }
protected IDragDropService DragDropService { get; }
/// <summary>
/// Получает текущие границы элемента в экранных координатах.
@@ -116,13 +99,13 @@ public abstract class DropTargetBehaviorBase<TElement> : IDropTarget
/// <summary>
/// Инициализирует новый экземпляр класса <see cref="DropTargetBehaviorBase{TElement}"/>.
/// </summary>
/// <param name="serviceProvider">Провайдер сервисов для разрешения зависимостей.</param>
/// <param name="dragDropService">Сервис перетаскивания.</param>
/// <exception cref="ArgumentNullException">
/// Выбрасывается, когда <paramref name="serviceProvider"/> равен null.
/// Выбрасывается, когда <paramref name="dragDropService"/> равен null.
/// </exception>
protected DropTargetBehaviorBase(IServiceProvider serviceProvider)
protected DropTargetBehaviorBase(IDragDropService dragDropService)
{
ServiceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));
DragDropService = dragDropService ?? throw new ArgumentNullException(nameof(dragDropService));
}
/// <summary>

View File

@@ -1,194 +0,0 @@
using Lattice.Core.DragDrop.Services;
using Lattice.UI.DragDrop.Abstractions;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
namespace Lattice.UI.DragDrop.Extensions;
/// <summary>
/// Методы расширения для регистрации сервисов перетаскивания в контейнере зависимостей.
/// </summary>
public static class ServiceCollectionExtensions
{
/// <summary>
/// Добавляет сервисы перетаскивания в контейнер зависимостей.
/// </summary>
/// <param name="services">Коллекция сервисов для регистрации.</param>
/// <returns>Коллекция сервисов с зарегистрированными сервисами перетаскивания.</returns>
/// <remarks>
/// <para>
/// Этот метод регистрирует основные сервисы перетаскивания, необходимые для работы системы:
/// </para>
/// <list type="bullet">
/// <item>Основной сервис управления перетаскиванием (<see cref="IDragDropService"/>)</item>
/// <item>Абстракции для визуального представления и обратной связи</item>
/// <item>Провайдеры по умолчанию с безопасной реализацией</item>
/// </list>
/// <para>
/// Для полноценной работы в конкретной UI-платформе (WPF, Avalonia, MAUI и т.д.)
/// необходимо переопределить регистрации платформенными реализациями.
/// </para>
/// </remarks>
public static IServiceCollection AddLatticeDragDrop(this IServiceCollection services)
{
// Регистрация основного сервиса перетаскивания
services.TryAddSingleton<IDragDropService, DragDropService>();
// Регистрация UI-специфичных абстракций с реализациями по умолчанию
// Эти реализации безопасны (ничего не делают), но могут быть переопределены платформенными реализациями
services.TryAddSingleton<IDragVisualProvider, DefaultDragVisualProvider>();
services.TryAddSingleton<IDropVisualAdorner, DefaultDropVisualAdorner>();
services.TryAddSingleton<IDragDropHost, DefaultDragDropHost>();
return services;
}
/// <summary>
/// Добавляет или заменяет реализацию поставщика визуального представления перетаскивания.
/// </summary>
/// <typeparam name="TProvider">Тип поставщика визуального представления.</typeparam>
/// <param name="services">Коллекция сервисов.</param>
/// <returns>Коллекция сервисов.</returns>
/// <remarks>
/// Используйте этот метод для регистрации платформенной реализации поставщика визуального представления.
/// </remarks>
public static IServiceCollection AddDragVisualProvider<TProvider>(this IServiceCollection services)
where TProvider : class, IDragVisualProvider
{
services.Replace(ServiceDescriptor.Singleton<IDragVisualProvider, TProvider>());
return services;
}
/// <summary>
/// Добавляет или заменяет реализацию визуальной обратной связи для цели сброса.
/// </summary>
/// <typeparam name="TAdorner">Тип элемента визуальной обратной связи.</typeparam>
/// <param name="services">Коллекция сервисов.</param>
/// <returns>Коллекция сервисов.</returns>
/// <remarks>
/// Используйте этот метод для регистрации платформенной реализации визуальной обратной связи.
/// </remarks>
public static IServiceCollection AddDropVisualAdorner<TAdorner>(this IServiceCollection services)
where TAdorner : class, IDropVisualAdorner
{
services.Replace(ServiceDescriptor.Singleton<IDropVisualAdorner, TAdorner>());
return services;
}
/// <summary>
/// Добавляет или заменяет реализацию хоста для отображения визуальных элементов.
/// </summary>
/// <typeparam name="THost">Тип хоста визуальных элементов.</typeparam>
/// <param name="services">Коллекция сервисов.</param>
/// <returns>Коллекция сервисов.</returns>
/// <remarks>
/// Используйте этот метод для регистрации платформенной реализации хоста визуальных элементов.
/// </remarks>
public static IServiceCollection AddDragDropHost<THost>(this IServiceCollection services)
where THost : class, IDragDropHost
{
services.Replace(ServiceDescriptor.Singleton<IDragDropHost, THost>());
return services;
}
#region Default Implementations
/// <summary>
/// Безопасная реализация поставщика визуального представления по умолчанию.
/// </summary>
/// <remarks>
/// Эта реализация ничего не делает и используется как заглушка до тех пор,
/// пока не будет предоставлена платформенная реализация.
/// </remarks>
private class DefaultDragVisualProvider : IDragVisualProvider
{
/// <inheritdoc/>
public object? CreateDragVisual(Core.DragDrop.Models.DragInfo dragInfo, Core.Geometry.Point initialPosition)
{
// Безопасная реализация: не создает визуальное представление
return null;
}
/// <inheritdoc/>
public void UpdateDragVisualPosition(object dragVisual, Core.Geometry.Point position)
{
// Ничего не делаем, так как визуальное представление не было создано
}
/// <inheritdoc/>
public void ReleaseDragVisual(object dragVisual)
{
// Ничего не делаем, так как визуальное представление не было создано
}
}
/// <summary>
/// Безопасная реализация визуальной обратной связи по умолчанию.
/// </summary>
/// <remarks>
/// Эта реализация ничего не делает и используется как заглушка до тех пор,
/// пока не будет предоставлена платформенная реализация.
/// </remarks>
private class DefaultDropVisualAdorner : IDropVisualAdorner
{
/// <inheritdoc/>
public void Show(Core.DragDrop.Models.DropInfo dropInfo, Core.Geometry.Rect targetBounds)
{
// Безопасная реализация: не отображает визуальную обратную связь
}
/// <inheritdoc/>
public void Update(Core.DragDrop.Models.DropInfo dropInfo)
{
// Ничего не делаем, так как обратная связь не отображается
}
/// <inheritdoc/>
public void Hide()
{
// Ничего не делаем, так как обратная связь не отображается
}
}
/// <summary>
/// Безопасная реализация хоста визуальных элементов по умолчанию.
/// </summary>
/// <remarks>
/// Эта реализация ничего не делает и используется как заглушка до тех пор,
/// пока не будет предоставлена платформенная реализация.
/// </remarks>
private class DefaultDragDropHost : IDragDropHost
{
/// <inheritdoc/>
public void ShowDragVisual(object dragVisual, Core.Geometry.Point position)
{
// Безопасная реализация: не отображает визуальный элемент
}
/// <inheritdoc/>
public void UpdateDragVisualPosition(object dragVisual, Core.Geometry.Point position)
{
// Ничего не делаем, так как визуальный элемент не отображается
}
/// <inheritdoc/>
public void HideDragVisual(object dragVisual)
{
// Ничего не делаем, так как визуальный элемент не отображается
}
/// <inheritdoc/>
public void ShowDropAdorner(IDropVisualAdorner adorner)
{
// Безопасная реализация: не отображает обратную связь
}
/// <inheritdoc/>
public void HideDropAdorner(IDropVisualAdorner adorner)
{
// Ничего не делаем, так как обратная связь не отображается
}
}
#endregion
}

View File

@@ -13,8 +13,4 @@
<ProjectReference Include="..\Lattice.Core.Geometry\Lattice.Core.Geometry.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.0" />
</ItemGroup>
</Project>