ChipDemo/Core/Features/FeatureWrapper.cs

144 lines
3.8 KiB
C#
Raw Normal View History

2023-04-07 22:10:35 +08:00
using System.ComponentModel.Design;
using Demo.Models;
namespace Demo.Features;
public class FeatureWrapper<TMetadata>
where TMetadata : IMetadata
{
private readonly TMetadata _metadata;
protected FeatureList<TMetadata> Features { get; }
public FeatureWrapper(TMetadata metadata, FeatureList<TMetadata>? features = null)
{
_metadata = metadata;
Features = features ?? new FeatureList<TMetadata>();
}
public FeatureWrapper<TMetadata> DropFeature(string name)
{
if (String.IsNullOrWhiteSpace(name))
{
throw new CheckoutException("功能名称不能为空或空白字符");
}
Features.Remove(name);
return this;
}
/// <summary>
/// 添加功能
/// </summary>
/// <param name="feature"></param>
/// <typeparam name="TFeature"></typeparam>
/// <returns></returns>
public FeatureWrapper<TMetadata> WithFeature<TFeature>(TFeature feature)
2023-04-08 08:35:57 +08:00
where TFeature : Feature
2023-04-07 22:10:35 +08:00
{
if (feature is null)
{
return this;
}
if (String.IsNullOrWhiteSpace(feature.Name))
{
throw new CheckoutException("功能名称不能为空或空白字符");
}
Features.TryAdd(feature.Name, feature);
return this;
}
/// <summary>
/// 添加功能
/// </summary>
/// <param name="name"></param>
/// <param name="feature"></param>
/// <param name="order"></param>
/// <returns></returns>
2023-04-08 08:35:57 +08:00
public FeatureWrapper<TMetadata> WithFeature(string name, FeatureFunction feature, int order = 1)
2023-04-07 22:10:35 +08:00
{
if (String.IsNullOrWhiteSpace(name))
{
throw new CheckoutException("功能名称不能为空或空白字符");
}
if (feature is not null)
{
2023-04-08 08:35:57 +08:00
Features.TryAdd(name, new DefaultFeature(name, feature, order: order));
2023-04-07 22:10:35 +08:00
}
return this;
}
/// <summary>
/// 添加功能
/// </summary>
/// <param name="name"></param>
/// <param name="feature"></param>
/// <param name="order"></param>
/// <returns></returns>
2023-04-08 08:35:57 +08:00
public FeatureWrapper<TMetadata> WithFeature(string name, FeatureFunctionAsync feature, int order = 1)
2023-04-07 22:10:35 +08:00
{
if (String.IsNullOrWhiteSpace(name))
{
throw new CheckoutException("功能名称不能为空或空白字符");
}
if (feature is not null)
{
2023-04-08 08:35:57 +08:00
Features.TryAdd(name, new DefaultFeature(name, executeFunctionAsync: feature, order: order));
2023-04-07 22:10:35 +08:00
}
return this;
}
2023-04-08 08:35:57 +08:00
public void ExecuteAll()
2023-04-07 22:10:35 +08:00
{
foreach (var feature in Features.Values.OrderBy(f => f.Order))
{
try
{
feature.Execute(_metadata);
if (feature.Finished)
{
break;
}
}
catch (Exception ex)
{
2023-04-08 08:35:57 +08:00
feature.OnException(new FeatureExceptionContext(feature, new FeatureException(_metadata, feature, ex)));
2023-04-07 22:10:35 +08:00
}
}
}
public void Execute(string name)
{
if (Features.TryGetValue(name, out var feature))
{
feature.Execute(_metadata);
}
else
{
throw new KeyNotFoundException(name);
}
}
2023-04-08 08:35:57 +08:00
public async ValueTask ExecuteAllAsync()
2023-04-07 22:10:35 +08:00
{
foreach (var feature in Features.Values.OrderBy(f => f.Order))
{
try
{
await feature.ExecuteAsync(_metadata);
if (feature.Finished)
{
break;
}
}
catch (Exception ex)
{
2023-04-08 08:35:57 +08:00
await feature.OnExceptionAsync(new FeatureExceptionContext(feature, new FeatureException(_metadata, feature, ex)));
2023-04-07 22:10:35 +08:00
}
}
}
}