Отказ от DI и добавление фабрик
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user