Skip to content

Commit

Permalink
Merge pull request #65 from NerosoftDev/develop
Browse files Browse the repository at this point in the history
Remove interface constraint for UserCase input/output.
  • Loading branch information
Codespilot authored Dec 20, 2023
2 parents 7449fe8 + eda4ed4 commit d3fb355
Show file tree
Hide file tree
Showing 6 changed files with 68 additions and 15 deletions.
3 changes: 1 addition & 2 deletions Source/Euonia.Application/UseCase/DefaultUseCasePresenter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@
/// </summary>
/// <typeparam name="TOutput"></typeparam>
public class DefaultUseCasePresenter<TOutput> : DisposableObject,
IUseCasePresenter<TOutput>
where TOutput : IUseCaseOutput
IUseCasePresenter<TOutput>
{
/// <inheritdoc/>
public event EventHandler<TOutput> OnSucceed;
Expand Down
8 changes: 7 additions & 1 deletion Source/Euonia.Application/UseCase/EmptyUseCaseOutput.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,10 @@
/// <summary>
/// Represents the use case should not return any output.
/// </summary>
public sealed record EmptyUseCaseOutput : IUseCaseOutput;
public sealed record EmptyUseCaseOutput : IUseCaseOutput
{
/// <summary>
/// Gets a new instance of <see cref="EmptyUseCaseOutput"/>.
/// </summary>
public static EmptyUseCaseOutput Instance { get; } = new();
}
64 changes: 57 additions & 7 deletions Source/Euonia.Application/UseCase/IUseCase.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,25 @@
namespace Nerosoft.Euonia.Application;

/// <summary>
/// Defines an interface for use case.
/// </summary>
public interface IUseCase
{
/// <summary>
/// Executes the use case.
/// </summary>
/// <param name="input"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<object> ExecuteAsync(object input, CancellationToken cancellationToken = default);
}

/// <summary>
/// Defines an interface for use case.
/// </summary>
/// <typeparam name="TInput"></typeparam>
/// <typeparam name="TOutput"></typeparam>
public interface IUseCase<in TInput, TOutput>
where TInput : IUseCaseInput
where TOutput : IUseCaseOutput
public interface IUseCase<in TInput, TOutput> : IUseCase
{
/// <summary>
/// Executes the use case.
Expand All @@ -16,20 +28,58 @@ public interface IUseCase<in TInput, TOutput>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<TOutput> ExecuteAsync(TInput input, CancellationToken cancellationToken = default);

Task<object> IUseCase.ExecuteAsync(object input, CancellationToken cancellationToken)
=> ExecuteAsync((TInput)input, cancellationToken).ContinueWith(t => (object)t.Result, cancellationToken);
}

/// <summary>
/// Defines an interface for use case.
/// Defines an interface for use case that has non output.
/// </summary>
/// <typeparam name="TInput"></typeparam>
public interface IUseCase<in TInput>
where TInput : IUseCaseInput
public interface INonOutputUseCase<in TInput> : IUseCase<TInput, EmptyUseCaseOutput>
{
/// <summary>
/// Executes the use case.
/// </summary>
/// <param name="input"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task ExecuteAsync(TInput input, CancellationToken cancellationToken = default);
new Task ExecuteAsync(TInput input, CancellationToken cancellationToken = default);

Task<EmptyUseCaseOutput> IUseCase<TInput, EmptyUseCaseOutput>.ExecuteAsync(TInput input, CancellationToken cancellationToken)
=> ExecuteAsync(input, cancellationToken).ContinueWith(_ => EmptyUseCaseOutput.Instance, cancellationToken);
}

/// <summary>
/// Defines an interface for use case that has non input parameter.
/// </summary>
/// <typeparam name="TOutput"></typeparam>
public interface INonInputUseCase<TOutput> : IUseCase<EmptyUseCaseInput, TOutput>
{
/// <summary>
/// Executes the use case.
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<TOutput> ExecuteAsync(CancellationToken cancellationToken = default);

Task<TOutput> IUseCase<EmptyUseCaseInput, TOutput>.ExecuteAsync(EmptyUseCaseInput _, CancellationToken cancellationToken)
=> ExecuteAsync(cancellationToken);
}

/// <summary>
/// Defines an interface for use case that has non input parameter and non output.
/// </summary>
public interface IParameterlessUseCase : IUseCase<EmptyUseCaseInput, EmptyUseCaseOutput>
{
/// <summary>
/// Executes the use case.
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task ExecuteAsync(CancellationToken cancellationToken = default);

Task<EmptyUseCaseOutput> IUseCase<EmptyUseCaseInput, EmptyUseCaseOutput>.ExecuteAsync(EmptyUseCaseInput _, CancellationToken cancellationToken)
=> ExecuteAsync(cancellationToken).ContinueWith(_ => EmptyUseCaseOutput.Instance, cancellationToken);
}
1 change: 0 additions & 1 deletion Source/Euonia.Application/UseCase/IUseCaseOutputSuccess.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
/// </summary>
/// <typeparam name="TOutput"></typeparam>
public interface IUseCaseOutputSuccess<in TOutput>
where TOutput : IUseCaseOutput
{
/// <summary>
///
Expand Down
5 changes: 2 additions & 3 deletions Source/Euonia.Application/UseCase/IUseCasePresenter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@
/// </summary>
/// <typeparam name="TOutput"></typeparam>
public interface IUseCasePresenter<TOutput> : IUseCaseOutputFailure,
IUseCaseOutputSuccess<TOutput>,
IDisposable
where TOutput : IUseCaseOutput
IUseCaseOutputSuccess<TOutput>,
IDisposable
{
/// <summary>
/// Occurs when the use case is successfully executed.
Expand Down
2 changes: 1 addition & 1 deletion project.props
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<Version>8.1.14</Version>
<Version>8.1.15</Version>
<Authors>damon</Authors>
<Company>Nerosoft Ltd.</Company>
<Product>Euonia</Product>
Expand Down

0 comments on commit d3fb355

Please sign in to comment.