diff --git a/Honamic.Framework.sln b/Honamic.Framework.sln
index f5a9804..c02e6ae 100644
--- a/Honamic.Framework.sln
+++ b/Honamic.Framework.sln
@@ -129,6 +129,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "03.Facade", "03.Facade", "{
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Honamic.IdentityPlus.Facade", "src\IdentityPlus\Facade\Honamic.IdentityPlus.Facade.csproj", "{D7D9D8C5-EBDF-480C-A693-E6ED04143FFA}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Honamic.Framework.Applications.Abstractions", "src\Core\Applications.Abstractions\Honamic.Framework.Applications.Abstractions.csproj", "{29C37841-0CA2-9A52-9A08-90CA63C5E63A}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -299,6 +301,10 @@ Global
{D7D9D8C5-EBDF-480C-A693-E6ED04143FFA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D7D9D8C5-EBDF-480C-A693-E6ED04143FFA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D7D9D8C5-EBDF-480C-A693-E6ED04143FFA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {29C37841-0CA2-9A52-9A08-90CA63C5E63A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {29C37841-0CA2-9A52-9A08-90CA63C5E63A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {29C37841-0CA2-9A52-9A08-90CA63C5E63A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {29C37841-0CA2-9A52-9A08-90CA63C5E63A}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -365,6 +371,7 @@ Global
{8F5EAEEB-467C-412D-B131-D7469C70D375} = {3F098285-E155-4D9A-9371-E7C4CAEA17F3}
{82C3E682-28F0-4F65-93F1-A646085A9198} = {7ACD81EB-9F97-44A5-B91B-2E12C5F45607}
{D7D9D8C5-EBDF-480C-A693-E6ED04143FFA} = {82C3E682-28F0-4F65-93F1-A646085A9198}
+ {29C37841-0CA2-9A52-9A08-90CA63C5E63A} = {BC728FCA-02C3-4522-A7EB-7403B8674BBA}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {E15D83FC-8F5C-4D9C-9DCD-D114F5609922}
diff --git a/TodoSample/Core/Application.Contracts/Honamic.Todo.Application.Contracts.csproj b/TodoSample/Core/Application.Contracts/Honamic.Todo.Application.Contracts.csproj
index dcacb59..859ce99 100644
--- a/TodoSample/Core/Application.Contracts/Honamic.Todo.Application.Contracts.csproj
+++ b/TodoSample/Core/Application.Contracts/Honamic.Todo.Application.Contracts.csproj
@@ -10,6 +10,8 @@
+
+
diff --git a/TodoSample/Core/Application.Contracts/TodoItems/Commands/CreateTodoItemCommand.cs b/TodoSample/Core/Application.Contracts/TodoItems/Commands/CreateTodoItemCommand.cs
index bb2db74..58febff 100644
--- a/TodoSample/Core/Application.Contracts/TodoItems/Commands/CreateTodoItemCommand.cs
+++ b/TodoSample/Core/Application.Contracts/TodoItems/Commands/CreateTodoItemCommand.cs
@@ -1,5 +1,19 @@
+using Honamic.Framework.Applications.Results;
using Honamic.Framework.Commands;
namespace Honamic.Todo.Application.TodoItems.Commands;
public record CreateTodoItemCommand(string title, string content, List tags) : ICommand;
+
+
+
+
+public record CreateTodoItem2Command(string title, string content, List tags)
+ : ICommand>;
+
+
+
+public class CreateTodoItem2ResultCommand
+{
+ public long Id { get; set; }
+}
\ No newline at end of file
diff --git a/TodoSample/Core/Application/Extensions/ApplicationServiceCollectionExtensions.cs b/TodoSample/Core/Application/Extensions/ApplicationServiceCollectionExtensions.cs
index 2dde990..5d8ad7b 100644
--- a/TodoSample/Core/Application/Extensions/ApplicationServiceCollectionExtensions.cs
+++ b/TodoSample/Core/Application/Extensions/ApplicationServiceCollectionExtensions.cs
@@ -7,6 +7,7 @@
using Honamic.Framework.Tools.IdGenerators;
using Honamic.Todo.Application.TodoItems.EventHandlers;
using Honamic.IdentityPlus.Domain.Users;
+using Honamic.Framework.Applications.Results;
namespace Honamic.Todo.Application.Extensions;
@@ -25,6 +26,11 @@ private static void AddCommandHandlers(this IServiceCollection services)
{
services.AddCommandHandler();
services.AddCommandHandler();
+ services.AddCommandHandler<
+ CreateTodoItem2Command,
+ CreateTodoItem2CommandHandler,
+ Result>();
+
services.AddCommandHandler();
}
diff --git a/TodoSample/Core/Application/Honamic.Todo.Application.csproj b/TodoSample/Core/Application/Honamic.Todo.Application.csproj
index bb8f57a..d9b724b 100644
--- a/TodoSample/Core/Application/Honamic.Todo.Application.csproj
+++ b/TodoSample/Core/Application/Honamic.Todo.Application.csproj
@@ -9,7 +9,6 @@
-
diff --git a/TodoSample/Core/Application/TodoItems/CommandHandlers/CreateTodoItem2CommandHandler.cs b/TodoSample/Core/Application/TodoItems/CommandHandlers/CreateTodoItem2CommandHandler.cs
new file mode 100644
index 0000000..14e57fd
--- /dev/null
+++ b/TodoSample/Core/Application/TodoItems/CommandHandlers/CreateTodoItem2CommandHandler.cs
@@ -0,0 +1,33 @@
+using Honamic.Framework.Applications.Results;
+using Honamic.Framework.Commands;
+using Honamic.Framework.Domain;
+using Honamic.Todo.Application.TodoItems.Commands;
+using Honamic.Todo.Domain.TodoItems;
+
+namespace Honamic.Todo.Application.TodoItems.CommandHandlers;
+internal class CreateTodoItem2CommandHandler :
+ ICommandHandler>
+{
+ private readonly ITodoItemRepository _todoItemRepository;
+ private readonly IIdGenerator _idGenerator;
+
+ public CreateTodoItem2CommandHandler(ITodoItemRepository todoItemRepository, IIdGenerator idGenerator)
+ {
+ _todoItemRepository = todoItemRepository;
+ _idGenerator = idGenerator;
+ }
+
+ public async Task> HandleAsync(CreateTodoItem2Command command, CancellationToken cancellationToken)
+ {
+ var todoItem = new TodoItem(_idGenerator.GetNewId(), command.title, command.content, command.tags);
+ await _todoItemRepository.InsertAsync(todoItem);
+
+ var result = new CreateTodoItem2ResultCommand
+ {
+ Id = todoItem.Id
+ };
+
+ return result;
+ }
+
+}
diff --git a/TodoSample/Core/Domain/Honamic.Todo.Domain.csproj b/TodoSample/Core/Domain/Honamic.Todo.Domain.csproj
index 5232606..cae907c 100644
--- a/TodoSample/Core/Domain/Honamic.Todo.Domain.csproj
+++ b/TodoSample/Core/Domain/Honamic.Todo.Domain.csproj
@@ -8,7 +8,7 @@
-
+
diff --git a/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/Honamic.Todo.Endpoints.WebApi.csproj b/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/Honamic.Todo.Endpoints.WebApi.csproj
index 4581814..89ca733 100644
--- a/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/Honamic.Todo.Endpoints.WebApi.csproj
+++ b/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/Honamic.Todo.Endpoints.WebApi.csproj
@@ -11,12 +11,12 @@
-
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
+
+
diff --git a/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/TodoItems/TodoItems2Controller.cs b/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/TodoItems/TodoItems2Controller.cs
new file mode 100644
index 0000000..c3d8436
--- /dev/null
+++ b/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/TodoItems/TodoItems2Controller.cs
@@ -0,0 +1,30 @@
+using Honamic.Framework.Applications.Results;
+using Honamic.Framework.Commands;
+using Honamic.Todo.Application.TodoItems.Commands;
+using Microsoft.AspNetCore.Mvc;
+
+namespace Honamic.Todo.Endpoints.WebApi.Controllers;
+
+[Route("api/[controller]")]
+[ApiController]
+public class TodoItems2Controller : ControllerBase
+{
+ private readonly ILogger _logger;
+ private readonly ICommandBus _commandBus;
+
+ public TodoItems2Controller(ILogger logger, ICommandBus commandBus)
+ {
+ _logger = logger;
+ _commandBus = commandBus;
+ }
+
+ [HttpPost]
+ public async Task> Post([FromBody] CreateTodoItem2Command model, CancellationToken cancellationToken)
+ {
+ return await _commandBus
+ .DispatchAsync>
+ (model, cancellationToken);
+ }
+
+
+}
diff --git a/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/TodoItems/TodoItemsController.cs b/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/TodoItems/TodoItemsController.cs
index a4ea2b5..bf98524 100644
--- a/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/TodoItems/TodoItemsController.cs
+++ b/TodoSample/Endpoints/WebApi/Honamic.Todo.Endpoints.WebApi/TodoItems/TodoItemsController.cs
@@ -1,4 +1,4 @@
-using Honamic.Framework.Facade.Results;
+using Honamic.Framework.Applications.Results;
using Honamic.Framework.Queries;
using Honamic.Todo.Application.TodoItems.Commands;
using Honamic.Todo.Facade.TodoItems;
@@ -37,6 +37,12 @@ public Task> Get(long id, CancellationToken cancellationTo
}
+ [HttpPost("Create")]
+ public Task> Create([FromBody] CreateTodoItemCommand model, CancellationToken cancellationToken)
+ {
+ return _todoItemFacade.Create(model, cancellationToken);
+ }
+
[HttpPost]
public Task> Post([FromBody] CreateTodoItemCommand model, CancellationToken cancellationToken)
{
diff --git a/TodoSample/Facade/Honamic.Todo.Facade.csproj b/TodoSample/Facade/Honamic.Todo.Facade.csproj
index 9aaa471..d7bcfda 100644
--- a/TodoSample/Facade/Honamic.Todo.Facade.csproj
+++ b/TodoSample/Facade/Honamic.Todo.Facade.csproj
@@ -8,7 +8,7 @@
-
+
diff --git a/TodoSample/Facade/TodoItems/ITodoItemFacade.cs b/TodoSample/Facade/TodoItems/ITodoItemFacade.cs
index becc997..fa0a9bb 100644
--- a/TodoSample/Facade/TodoItems/ITodoItemFacade.cs
+++ b/TodoSample/Facade/TodoItems/ITodoItemFacade.cs
@@ -1,5 +1,5 @@
-using Honamic.Framework.Facade;
-using Honamic.Framework.Facade.Results;
+using Honamic.Framework.Applications.Results;
+using Honamic.Framework.Facade;
using Honamic.Todo.Application.TodoItems.Commands;
namespace Honamic.Todo.Facade.TodoItems;
diff --git a/TodoSample/Facade/TodoItems/ITodoItemQueryFacade.cs b/TodoSample/Facade/TodoItems/ITodoItemQueryFacade.cs
index 91a9d00..b2eb962 100644
--- a/TodoSample/Facade/TodoItems/ITodoItemQueryFacade.cs
+++ b/TodoSample/Facade/TodoItems/ITodoItemQueryFacade.cs
@@ -1,5 +1,5 @@
-using Honamic.Framework.Facade;
-using Honamic.Framework.Facade.Results;
+using Honamic.Framework.Applications.Results;
+using Honamic.Framework.Facade;
using Honamic.Framework.Queries;
using Honamic.Todo.Query.Domain.TodoItems.Models;
using Honamic.Todo.Query.Domain.TodoItems.Queries;
diff --git a/TodoSample/Facade/TodoItems/TodoItemFacade.cs b/TodoSample/Facade/TodoItems/TodoItemFacade.cs
index cf5efe7..61d0c9c 100644
--- a/TodoSample/Facade/TodoItems/TodoItemFacade.cs
+++ b/TodoSample/Facade/TodoItems/TodoItemFacade.cs
@@ -1,7 +1,7 @@
-using Honamic.Framework.Commands;
+using Honamic.Framework.Applications.Results;
+using Honamic.Framework.Commands;
using Honamic.Framework.Events;
using Honamic.Framework.Facade;
-using Honamic.Framework.Facade.Results;
using Honamic.Todo.Application.TodoItems.Commands;
using Honamic.Todo.Domain.TodoItems;
using Microsoft.Extensions.Logging;
diff --git a/TodoSample/Facade/TodoItems/TodoItemQueryFacade.cs b/TodoSample/Facade/TodoItems/TodoItemQueryFacade.cs
index c5aa0b6..304250c 100644
--- a/TodoSample/Facade/TodoItems/TodoItemQueryFacade.cs
+++ b/TodoSample/Facade/TodoItems/TodoItemQueryFacade.cs
@@ -1,11 +1,11 @@
using Honamic.Framework.Facade;
-using Honamic.Framework.Facade.Results;
using Honamic.Framework.Queries;
using Microsoft.Extensions.Logging;
using System.ComponentModel;
using Honamic.Todo.Query.Domain.TodoItems.Models;
using Honamic.Todo.Query.Domain.TodoItems.Queries;
using Honamic.Todo.Query.Domain.TodoItems;
+using Honamic.Framework.Applications.Results;
namespace Honamic.Todo.Facade.TodoItems;
diff --git a/TodoSample/Infra/Persistence/Honamic.Todo.Persistence.EntityFramework.csproj b/TodoSample/Infra/Persistence/Honamic.Todo.Persistence.EntityFramework.csproj
index c53ea5e..b4beb54 100644
--- a/TodoSample/Infra/Persistence/Honamic.Todo.Persistence.EntityFramework.csproj
+++ b/TodoSample/Infra/Persistence/Honamic.Todo.Persistence.EntityFramework.csproj
@@ -10,14 +10,13 @@
-
-
-
+
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
diff --git a/TodoSample/Infra/Query/Honamic.Todo.Query.EntityFramework.csproj b/TodoSample/Infra/Query/Honamic.Todo.Query.EntityFramework.csproj
index c082588..53c5d91 100644
--- a/TodoSample/Infra/Query/Honamic.Todo.Query.EntityFramework.csproj
+++ b/TodoSample/Infra/Query/Honamic.Todo.Query.EntityFramework.csproj
@@ -9,8 +9,8 @@
-
-
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/src/Facade/Abstractions/Exceptions/UnauthenticatedException.cs b/src/Core/Applications.Abstractions/Exceptions/UnauthenticatedException.cs
similarity index 68%
rename from src/Facade/Abstractions/Exceptions/UnauthenticatedException.cs
rename to src/Core/Applications.Abstractions/Exceptions/UnauthenticatedException.cs
index 6e4ed3f..0fdaeeb 100644
--- a/src/Facade/Abstractions/Exceptions/UnauthenticatedException.cs
+++ b/src/Core/Applications.Abstractions/Exceptions/UnauthenticatedException.cs
@@ -1,4 +1,4 @@
-namespace Honamic.Framework.Facade.Exceptions;
+namespace Honamic.Framework.Applications.Exceptions;
public class UnauthenticatedException : Exception
{
diff --git a/src/Facade/Abstractions/Exceptions/UnauthorizedException.cs b/src/Core/Applications.Abstractions/Exceptions/UnauthorizedException.cs
similarity index 85%
rename from src/Facade/Abstractions/Exceptions/UnauthorizedException.cs
rename to src/Core/Applications.Abstractions/Exceptions/UnauthorizedException.cs
index 39f358f..9ab570d 100644
--- a/src/Facade/Abstractions/Exceptions/UnauthorizedException.cs
+++ b/src/Core/Applications.Abstractions/Exceptions/UnauthorizedException.cs
@@ -1,4 +1,4 @@
-namespace Honamic.Framework.Facade.Exceptions;
+namespace Honamic.Framework.Applications.Exceptions;
public class UnauthorizedException : Exception
{
diff --git a/src/Core/Applications.Abstractions/Honamic.Framework.Applications.Abstractions.csproj b/src/Core/Applications.Abstractions/Honamic.Framework.Applications.Abstractions.csproj
new file mode 100644
index 0000000..76b8d66
--- /dev/null
+++ b/src/Core/Applications.Abstractions/Honamic.Framework.Applications.Abstractions.csproj
@@ -0,0 +1,9 @@
+
+
+
+ net8.0
+ enable
+ enable
+ $(MSBuildProjectName.Replace(" ", "_").Replace(".Abstractions", ""))
+
+
diff --git a/src/Facade/Abstractions/Results/HttpStatusCodes.cs b/src/Core/Applications.Abstractions/Results/HttpStatusCodes.cs
similarity index 99%
rename from src/Facade/Abstractions/Results/HttpStatusCodes.cs
rename to src/Core/Applications.Abstractions/Results/HttpStatusCodes.cs
index 421f1e8..312193c 100644
--- a/src/Facade/Abstractions/Results/HttpStatusCodes.cs
+++ b/src/Core/Applications.Abstractions/Results/HttpStatusCodes.cs
@@ -1,4 +1,4 @@
-namespace Honamic.Framework.Facade.Results;
+namespace Honamic.Framework.Applications.Results;
public static class HttpStatusCodes
{
diff --git a/src/Facade/Abstractions/Results/Result.cs b/src/Core/Applications.Abstractions/Results/Result.cs
similarity index 95%
rename from src/Facade/Abstractions/Results/Result.cs
rename to src/Core/Applications.Abstractions/Results/Result.cs
index 3e2ea35..c89ad1c 100644
--- a/src/Facade/Abstractions/Results/Result.cs
+++ b/src/Core/Applications.Abstractions/Results/Result.cs
@@ -1,6 +1,6 @@
using System.Collections.ObjectModel;
-namespace Honamic.Framework.Facade.Results;
+namespace Honamic.Framework.Applications.Results;
public class Result
{
diff --git a/src/Facade/Abstractions/Results/ResultMessage.cs b/src/Core/Applications.Abstractions/Results/ResultMessage.cs
similarity index 90%
rename from src/Facade/Abstractions/Results/ResultMessage.cs
rename to src/Core/Applications.Abstractions/Results/ResultMessage.cs
index 110d4eb..c351c67 100644
--- a/src/Facade/Abstractions/Results/ResultMessage.cs
+++ b/src/Core/Applications.Abstractions/Results/ResultMessage.cs
@@ -1,4 +1,4 @@
-namespace Honamic.Framework.Facade.Results;
+namespace Honamic.Framework.Applications.Results;
public class ResultMessage
{
diff --git a/src/Facade/Abstractions/Results/ResultMessagesExtensions.cs b/src/Core/Applications.Abstractions/Results/ResultMessagesExtensions.cs
similarity index 98%
rename from src/Facade/Abstractions/Results/ResultMessagesExtensions.cs
rename to src/Core/Applications.Abstractions/Results/ResultMessagesExtensions.cs
index e5e4d33..64477d8 100644
--- a/src/Facade/Abstractions/Results/ResultMessagesExtensions.cs
+++ b/src/Core/Applications.Abstractions/Results/ResultMessagesExtensions.cs
@@ -1,4 +1,4 @@
-namespace Honamic.Framework.Facade.Results;
+namespace Honamic.Framework.Applications.Results;
public static class ResultMessagesExtensions
{
diff --git a/src/Facade/Abstractions/Results/ResultStatus.cs b/src/Core/Applications.Abstractions/Results/ResultStatus.cs
similarity index 79%
rename from src/Facade/Abstractions/Results/ResultStatus.cs
rename to src/Core/Applications.Abstractions/Results/ResultStatus.cs
index 679bf9c..2e22fdc 100644
--- a/src/Facade/Abstractions/Results/ResultStatus.cs
+++ b/src/Core/Applications.Abstractions/Results/ResultStatus.cs
@@ -1,4 +1,4 @@
-namespace Honamic.Framework.Facade.Results;
+namespace Honamic.Framework.Applications.Results;
public enum ResultStatus
{
diff --git a/src/Core/Applications/CommandHandlerDecorators/ResultOrientedCommandHandlerDecorator.cs b/src/Core/Applications/CommandHandlerDecorators/ResultOrientedCommandHandlerDecorator.cs
new file mode 100644
index 0000000..05a514c
--- /dev/null
+++ b/src/Core/Applications/CommandHandlerDecorators/ResultOrientedCommandHandlerDecorator.cs
@@ -0,0 +1,107 @@
+using Honamic.Framework.Applications.Exceptions;
+using Honamic.Framework.Applications.Results;
+using Honamic.Framework.Commands;
+using Honamic.Framework.Domain;
+
+namespace Honamic.Framework.Applications.CommandHandlerDecorators;
+
+public class ResultOrientedCommandHandlerDecorator : ICommandHandler
+ where TCommand : ICommand
+{
+ private readonly ICommandHandler _commandHandler;
+
+ public ResultOrientedCommandHandlerDecorator(ICommandHandler commandHandler)
+ {
+ _commandHandler = commandHandler;
+ }
+
+ public async Task HandleAsync(TCommand command, CancellationToken cancellationToken)
+ {
+ TResponse result;
+ try
+ {
+ result = await _commandHandler.HandleAsync(command, cancellationToken);
+ }
+ catch (Exception ex)
+ {
+ if (IsResultOriented(typeof(TResponse)))
+ {
+ result = CreateResultWithError(typeof(TResponse), ex);
+ return result;
+ }
+
+ throw;
+ }
+
+ return result;
+ }
+
+ private TResponse CreateResultWithError(Type type, Exception ex)
+ {
+ var resultObject = CreateResult(type);
+
+ if (resultObject is Result result)
+ {
+ switch (ex)
+ {
+ case UnauthenticatedException:
+ result.SetStatusAsUnauthenticated();
+ result.AppendError(ex.Message);
+ break;
+ case UnauthorizedException:
+ result.SetStatusAsUnauthorized();
+ result.AppendError(ex.Message);
+ break;
+ case BusinessException businessException:
+ result.Status = ResultStatus.ValidationError;
+ var code = businessException.GetCode();
+ var message = businessException.GetMessage();
+ result.AppendError(message, null, code);
+ break;
+ default:
+ result.SetStatusAsUnhandledExceptionWithSorryError();
+ result.AppendError(ex.ToString(), "Exception");
+ break;
+ }
+ return resultObject;
+ }
+
+ // If we can't cast to Result, we have a serious error
+ throw new ArgumentException($"Expected a Result type but got {type.FullName}");
+ }
+
+ private TResponse CreateResult(Type type)
+ {
+ // For non-generic Result
+ if (type == typeof(Result))
+ {
+ return (TResponse)(object)new Result();
+ }
+
+ // For Result
+ if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Result<>))
+ {
+ var genericArgType = type.GenericTypeArguments[0];
+ var resultType = typeof(Result<>).MakeGenericType(genericArgType);
+ return (TResponse)Activator.CreateInstance(resultType);
+ }
+
+ return default;
+ }
+
+ private bool IsResultOriented(Type type)
+ {
+ if (type == typeof(Result))
+ {
+ return true;
+ }
+
+ if (type.IsGenericType
+ && type.GetGenericTypeDefinition() == typeof(Result<>))
+ {
+ return true;
+ }
+
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/src/Core/Applications/Extensions/ServiceCollectionExtensions.cs b/src/Core/Applications/Extensions/ServiceCollectionExtensions.cs
index 0d9a1af..f1309d6 100644
--- a/src/Core/Applications/Extensions/ServiceCollectionExtensions.cs
+++ b/src/Core/Applications/Extensions/ServiceCollectionExtensions.cs
@@ -2,11 +2,10 @@
using Honamic.Framework.Commands.Extensions;
using Honamic.Framework.Commands;
using Honamic.Framework.Applications.CommandHandlerDecorators;
-using Honamic.Framework.Domain.Defaults;
-using Honamic.Framework.Domain;
using Honamic.Framework.Events.Extensions;
using Honamic.Framework.Queries.Extensions;
using Honamic.Framework.Events;
+using Honamic.Framework.Domain.Extensions;
namespace Honamic.Framework.Applications.Extensions;
@@ -14,29 +13,21 @@ public static class ServiceCollectionExtensions
{
public static IServiceCollection AddDefaultApplicationsServices(this IServiceCollection services)
{
+ services.AddDefaultDomainServices();
+ services.AddDefaultEventsServices();
services.AddDefaultCommandsServices();
- services.AddDefaultDomainEventsDispatcherServices();
- services.AddSystemClock();
- services.AddDefaultEventBusServices();
services.AddDefaultQueriesServices();
return services;
}
- public static IServiceCollection AddSystemClock(this IServiceCollection services)
- {
- services.AddScoped();
-
- return services;
-
- }
-
public static void AddCommandHandler(this IServiceCollection services)
where TCommand : ICommand
where TCommandHandler : class, ICommandHandler
{
services.AddTransient, TCommandHandler>();
services.Decorate, TransactionalCommandHandlerDecorator>();
+ // Note: No ResultOriented decorator for non-response commands
}
public static void AddCommandHandler(this IServiceCollection services)
@@ -45,6 +36,7 @@ public static void AddCommandHandler(this
{
services.AddTransient, TCommandHandler>();
services.Decorate, TransactionalCommandHandlerDecorator>();
+ services.Decorate, ResultOrientedCommandHandlerDecorator>();
}
public static void AddEventHandler(this IServiceCollection services)
diff --git a/src/Core/Applications/Honamic.Framework.Applications.csproj b/src/Core/Applications/Honamic.Framework.Applications.csproj
index d2f5b49..3e62d05 100644
--- a/src/Core/Applications/Honamic.Framework.Applications.csproj
+++ b/src/Core/Applications/Honamic.Framework.Applications.csproj
@@ -1,4 +1,4 @@
-
+
net8.0
@@ -8,11 +8,11 @@
-
-
+
+
diff --git a/src/Core/Commands.Abstractions/Honamic.Framework.Commands.Abstractions.csproj b/src/Core/Commands.Abstractions/Honamic.Framework.Commands.Abstractions.csproj
index 295db34..76b8d66 100644
--- a/src/Core/Commands.Abstractions/Honamic.Framework.Commands.Abstractions.csproj
+++ b/src/Core/Commands.Abstractions/Honamic.Framework.Commands.Abstractions.csproj
@@ -6,8 +6,4 @@
enable
$(MSBuildProjectName.Replace(" ", "_").Replace(".Abstractions", ""))
-
-
-
-
diff --git a/src/Core/Commands/Honamic.Framework.Commands.csproj b/src/Core/Commands/Honamic.Framework.Commands.csproj
index 1816dec..c771a69 100644
--- a/src/Core/Commands/Honamic.Framework.Commands.csproj
+++ b/src/Core/Commands/Honamic.Framework.Commands.csproj
@@ -8,7 +8,7 @@
-
+
diff --git a/src/Core/Applications/DomainEventUserInfo.cs b/src/Core/Domain/DomainEventUserInfo.cs
similarity index 90%
rename from src/Core/Applications/DomainEventUserInfo.cs
rename to src/Core/Domain/DomainEventUserInfo.cs
index 1496c2c..ef09609 100644
--- a/src/Core/Applications/DomainEventUserInfo.cs
+++ b/src/Core/Domain/DomainEventUserInfo.cs
@@ -1,6 +1,6 @@
using Honamic.Framework.Events;
-namespace Honamic.Framework.Domain.Defaults;
+namespace Honamic.Framework.Domain;
public class DomainEventUserInfo : IEventUserInfo
{
diff --git a/src/Core/Domain/Extensions/ServiceCollectionExtensions.cs b/src/Core/Domain/Extensions/ServiceCollectionExtensions.cs
new file mode 100644
index 0000000..0c1fafd
--- /dev/null
+++ b/src/Core/Domain/Extensions/ServiceCollectionExtensions.cs
@@ -0,0 +1,20 @@
+using Microsoft.Extensions.DependencyInjection;
+
+namespace Honamic.Framework.Domain.Extensions;
+
+public static class ServiceCollectionExtensions
+{
+ public static IServiceCollection AddDefaultDomainServices(this IServiceCollection services)
+ {
+ services.AddSystemClock();
+ return services;
+ }
+
+ public static IServiceCollection AddSystemClock(this IServiceCollection services)
+ {
+ services.AddScoped();
+
+ return services;
+
+ }
+}
\ No newline at end of file
diff --git a/src/Core/Domain/Honamic.Framework.Domain.csproj b/src/Core/Domain/Honamic.Framework.Domain.csproj
index f4619bb..986fbc6 100644
--- a/src/Core/Domain/Honamic.Framework.Domain.csproj
+++ b/src/Core/Domain/Honamic.Framework.Domain.csproj
@@ -7,7 +7,7 @@
-
+
diff --git a/src/Core/Applications/SystemClock.cs b/src/Core/Domain/SystemClock.cs
similarity index 79%
rename from src/Core/Applications/SystemClock.cs
rename to src/Core/Domain/SystemClock.cs
index 7a46416..efa7570 100644
--- a/src/Core/Applications/SystemClock.cs
+++ b/src/Core/Domain/SystemClock.cs
@@ -1,4 +1,4 @@
-namespace Honamic.Framework.Domain.Defaults;
+namespace Honamic.Framework.Domain;
public class SystemClock : IClock
{
diff --git a/src/Core/Events/Extensions/ServiceCollectionExtensions.cs b/src/Core/Events/Extensions/ServiceCollectionExtensions.cs
index 39acf08..e181113 100644
--- a/src/Core/Events/Extensions/ServiceCollectionExtensions.cs
+++ b/src/Core/Events/Extensions/ServiceCollectionExtensions.cs
@@ -5,9 +5,10 @@ namespace Honamic.Framework.Events.Extensions;
public static class ServiceCollectionExtensions
{
- public static void AddDefaultEventssServices(this IServiceCollection services)
+ public static void AddDefaultEventsServices(this IServiceCollection services)
{
-
+ services.AddDefaultEventBusServices();
+ services.AddDefaultDomainEventsDispatcherServices();
}
public static void AddDefaultEventBusServices(this IServiceCollection services)
diff --git a/src/Core/Events/Honamic.Framework.Events.csproj b/src/Core/Events/Honamic.Framework.Events.csproj
index 77062b6..2c0a927 100644
--- a/src/Core/Events/Honamic.Framework.Events.csproj
+++ b/src/Core/Events/Honamic.Framework.Events.csproj
@@ -8,7 +8,7 @@
-
+
diff --git a/src/Core/Queries.Abstractions/Honamic.Framework.Queries.Abstractions.csproj b/src/Core/Queries.Abstractions/Honamic.Framework.Queries.Abstractions.csproj
index 77062b6..4c07ce3 100644
--- a/src/Core/Queries.Abstractions/Honamic.Framework.Queries.Abstractions.csproj
+++ b/src/Core/Queries.Abstractions/Honamic.Framework.Queries.Abstractions.csproj
@@ -7,10 +7,6 @@
$(MSBuildProjectName.Replace(" ", "_").Replace(".Abstractions", ""))
-
-
-
-
diff --git a/src/Core/Queries/Honamic.Framework.Queries.csproj b/src/Core/Queries/Honamic.Framework.Queries.csproj
index 34e2848..5ff0376 100644
--- a/src/Core/Queries/Honamic.Framework.Queries.csproj
+++ b/src/Core/Queries/Honamic.Framework.Queries.csproj
@@ -8,9 +8,9 @@
-
-
-
+
+
+
diff --git a/src/EntityFramework/Default/Honamic.Framework.EntityFramework.csproj b/src/EntityFramework/Default/Honamic.Framework.EntityFramework.csproj
index c95ae15..f1fc1aa 100644
--- a/src/EntityFramework/Default/Honamic.Framework.EntityFramework.csproj
+++ b/src/EntityFramework/Default/Honamic.Framework.EntityFramework.csproj
@@ -7,8 +7,8 @@
-
-
+
+
diff --git a/src/EntityFramework/Query/Honamic.Framework.EntityFramework.Query.csproj b/src/EntityFramework/Query/Honamic.Framework.EntityFramework.Query.csproj
index cfd4278..5222333 100644
--- a/src/EntityFramework/Query/Honamic.Framework.EntityFramework.Query.csproj
+++ b/src/EntityFramework/Query/Honamic.Framework.EntityFramework.Query.csproj
@@ -7,7 +7,7 @@
-
+
diff --git a/src/Facade/Abstractions/Honamic.Framework.Facade.Abstractions.csproj b/src/Facade/Abstractions/Honamic.Framework.Facade.Abstractions.csproj
index 7bebda1..ef90923 100644
--- a/src/Facade/Abstractions/Honamic.Framework.Facade.Abstractions.csproj
+++ b/src/Facade/Abstractions/Honamic.Framework.Facade.Abstractions.csproj
@@ -8,7 +8,11 @@
-
+
+
+
+
+
diff --git a/src/Facade/Default/Discovery/FacadeDiscovery.cs b/src/Facade/Default/Discovery/FacadeDiscovery.cs
index 1201731..9deea59 100644
--- a/src/Facade/Default/Discovery/FacadeDiscovery.cs
+++ b/src/Facade/Default/Discovery/FacadeDiscovery.cs
@@ -1,4 +1,4 @@
-using Honamic.Framework.Facade.Results;
+using Honamic.Framework.Applications.Results;
using Honamic.Framework.Utilities.Extensions;
using System.Reflection;
diff --git a/src/Facade/Default/Honamic.Framework.Facade.csproj b/src/Facade/Default/Honamic.Framework.Facade.csproj
index 494fa1a..d9694b7 100644
--- a/src/Facade/Default/Honamic.Framework.Facade.csproj
+++ b/src/Facade/Default/Honamic.Framework.Facade.csproj
@@ -8,10 +8,9 @@
-
-
+
-
+
diff --git a/src/Facade/Default/Interceptors/AuthorizeInterceptor.cs b/src/Facade/Default/Interceptors/AuthorizeInterceptor.cs
index 966ba3b..3615657 100644
--- a/src/Facade/Default/Interceptors/AuthorizeInterceptor.cs
+++ b/src/Facade/Default/Interceptors/AuthorizeInterceptor.cs
@@ -1,5 +1,5 @@
using Castle.DynamicProxy;
-using Honamic.Framework.Facade.Exceptions;
+using Honamic.Framework.Applications.Exceptions;
using Microsoft.Extensions.Logging;
using System.Reflection;
diff --git a/src/Facade/Default/Interceptors/ExceptionHandlingInterceptor.cs b/src/Facade/Default/Interceptors/ExceptionHandlingInterceptor.cs
index 7faa4aa..57524c6 100644
--- a/src/Facade/Default/Interceptors/ExceptionHandlingInterceptor.cs
+++ b/src/Facade/Default/Interceptors/ExceptionHandlingInterceptor.cs
@@ -1,6 +1,6 @@
using Castle.DynamicProxy;
-using Honamic.Framework.Facade.Exceptions;
-using Honamic.Framework.Facade.Results;
+using Honamic.Framework.Applications.Exceptions;
+using Honamic.Framework.Applications.Results;
using Microsoft.Extensions.Logging;
using System.Diagnostics;
using System.Reflection;
diff --git a/src/Facade/FastCrud.Web/Controllers/CrudController.cs b/src/Facade/FastCrud.Web/Controllers/CrudController.cs
index 7b4608a..63d4446 100644
--- a/src/Facade/FastCrud.Web/Controllers/CrudController.cs
+++ b/src/Facade/FastCrud.Web/Controllers/CrudController.cs
@@ -1,7 +1,7 @@
-using Honamic.Framework.Domain;
+using Honamic.Framework.Applications.Results;
+using Honamic.Framework.Domain;
using Honamic.Framework.Endpoints.Web;
using Honamic.Framework.Facade.FastCrud.Dtos;
-using Honamic.Framework.Facade.Results;
using Honamic.Framework.Queries;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
diff --git a/src/Facade/FastCrud/CrudEntityFacade.cs b/src/Facade/FastCrud/CrudEntityFacade.cs
index 0e2037e..fd2a1c2 100644
--- a/src/Facade/FastCrud/CrudEntityFacade.cs
+++ b/src/Facade/FastCrud/CrudEntityFacade.cs
@@ -7,8 +7,8 @@
using Microsoft.Extensions.Logging;
using System.Linq.Dynamic.Core;
using Honamic.Framework.Utilities.Extensions;
-using Honamic.Framework.Facade.Results;
using Honamic.Framework.Facade.FastCrud.Dtos;
+using Honamic.Framework.Applications.Results;
namespace Honamic.Framework.Facade.FastCrud;
diff --git a/src/Facade/FastCrud/Honamic.Framework.Facade.FastCrud.csproj b/src/Facade/FastCrud/Honamic.Framework.Facade.FastCrud.csproj
index e1b0465..6261134 100644
--- a/src/Facade/FastCrud/Honamic.Framework.Facade.FastCrud.csproj
+++ b/src/Facade/FastCrud/Honamic.Framework.Facade.FastCrud.csproj
@@ -8,10 +8,10 @@
-
-
-
-
+
+
+
+
diff --git a/src/Facade/FastCrud/ICrudEntityFacade.cs b/src/Facade/FastCrud/ICrudEntityFacade.cs
index d88107f..c41f902 100644
--- a/src/Facade/FastCrud/ICrudEntityFacade.cs
+++ b/src/Facade/FastCrud/ICrudEntityFacade.cs
@@ -1,6 +1,6 @@
-using Honamic.Framework.Domain;
+using Honamic.Framework.Applications.Results;
+using Honamic.Framework.Domain;
using Honamic.Framework.Facade.FastCrud.Dtos;
-using Honamic.Framework.Facade.Results;
using Honamic.Framework.Queries;
namespace Honamic.Framework.Facade.FastCrud;
diff --git a/src/Facade/Web/Honamic.Framework.Facade.Web.csproj b/src/Facade/Web/Honamic.Framework.Facade.Web.csproj
index 9841509..7693cbd 100644
--- a/src/Facade/Web/Honamic.Framework.Facade.Web.csproj
+++ b/src/Facade/Web/Honamic.Framework.Facade.Web.csproj
@@ -11,7 +11,7 @@
-
+
diff --git a/src/Facade/Web/Middleware/ExceptionToFacadeResultMiddleware.cs b/src/Facade/Web/Middleware/ExceptionToFacadeResultMiddleware.cs
index 9801cf8..6e907de 100644
--- a/src/Facade/Web/Middleware/ExceptionToFacadeResultMiddleware.cs
+++ b/src/Facade/Web/Middleware/ExceptionToFacadeResultMiddleware.cs
@@ -1,6 +1,6 @@
-using Honamic.Framework.Domain;
-using Honamic.Framework.Facade.Exceptions;
-using Honamic.Framework.Facade.Results;
+using Honamic.Framework.Applications.Exceptions;
+using Honamic.Framework.Applications.Results;
+using Honamic.Framework.Domain;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
diff --git a/src/Facade/Web/Results/BadRequestFacadeResult.cs b/src/Facade/Web/Results/BadRequestFacadeResult.cs
index ccb4ada..7f265a9 100644
--- a/src/Facade/Web/Results/BadRequestFacadeResult.cs
+++ b/src/Facade/Web/Results/BadRequestFacadeResult.cs
@@ -1,4 +1,4 @@
-using Honamic.Framework.Facade.Results;
+using Honamic.Framework.Applications.Results;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Infrastructure;
diff --git a/src/Facade/Web/Results/ResultToAction.cs b/src/Facade/Web/Results/ResultToAction.cs
index c8a54ef..d97d3f6 100644
--- a/src/Facade/Web/Results/ResultToAction.cs
+++ b/src/Facade/Web/Results/ResultToAction.cs
@@ -1,4 +1,4 @@
-using Honamic.Framework.Facade.Results;
+using Honamic.Framework.Applications.Results;
using Microsoft.AspNetCore.Mvc;
namespace Honamic.Framework.Facade.Web.Results;
diff --git a/src/IdentityPlus/Application/Honamic.IdentityPlus.Application.csproj b/src/IdentityPlus/Application/Honamic.IdentityPlus.Application.csproj
index 11b0f26..4132c85 100644
--- a/src/IdentityPlus/Application/Honamic.IdentityPlus.Application.csproj
+++ b/src/IdentityPlus/Application/Honamic.IdentityPlus.Application.csproj
@@ -11,9 +11,8 @@
-
-
+
diff --git a/src/IdentityPlus/Facade/Accounts/AccountFacade.cs b/src/IdentityPlus/Facade/Accounts/AccountFacade.cs
index 2ae1327..4cb733c 100644
--- a/src/IdentityPlus/Facade/Accounts/AccountFacade.cs
+++ b/src/IdentityPlus/Facade/Accounts/AccountFacade.cs
@@ -1,6 +1,6 @@
-using Honamic.Framework.Commands;
+using Honamic.Framework.Applications.Results;
+using Honamic.Framework.Commands;
using Honamic.Framework.Facade;
-using Honamic.Framework.Facade.Results;
using Honamic.Framework.Queries;
using Honamic.IdentityPlus.Application.Accounts.Commands;
using Honamic.IdentityPlus.Application.Accounts.Commands.Register;
diff --git a/src/IdentityPlus/Facade/Accounts/IAccountFacade.cs b/src/IdentityPlus/Facade/Accounts/IAccountFacade.cs
index 51106fe..51dcd01 100644
--- a/src/IdentityPlus/Facade/Accounts/IAccountFacade.cs
+++ b/src/IdentityPlus/Facade/Accounts/IAccountFacade.cs
@@ -1,5 +1,5 @@
-using Honamic.Framework.Facade;
-using Honamic.Framework.Facade.Results;
+using Honamic.Framework.Applications.Results;
+using Honamic.Framework.Facade;
using Honamic.IdentityPlus.Application.Accounts.Commands;
using Honamic.IdentityPlus.Application.Accounts.Commands.Register;
using Microsoft.AspNetCore.Http.HttpResults;
diff --git a/src/IdentityPlus/Facade/Honamic.IdentityPlus.Facade.csproj b/src/IdentityPlus/Facade/Honamic.IdentityPlus.Facade.csproj
index 898dd60..c320604 100644
--- a/src/IdentityPlus/Facade/Honamic.IdentityPlus.Facade.csproj
+++ b/src/IdentityPlus/Facade/Honamic.IdentityPlus.Facade.csproj
@@ -6,9 +6,6 @@
enable
-
-
-
diff --git a/src/IdentityPlus/Facade/Users/IUserFacade.cs b/src/IdentityPlus/Facade/Users/IUserFacade.cs
index 63671b4..9510813 100644
--- a/src/IdentityPlus/Facade/Users/IUserFacade.cs
+++ b/src/IdentityPlus/Facade/Users/IUserFacade.cs
@@ -1,5 +1,5 @@
-using Honamic.Framework.Facade;
-using Honamic.Framework.Facade.Results;
+using Honamic.Framework.Applications.Results;
+using Honamic.Framework.Facade;
using Honamic.Framework.Queries;
using Honamic.IdentityPlus.Application.Users.Queries;
diff --git a/src/IdentityPlus/Facade/Users/UserFacade.cs b/src/IdentityPlus/Facade/Users/UserFacade.cs
index 7cfa8fe..b3a28a0 100644
--- a/src/IdentityPlus/Facade/Users/UserFacade.cs
+++ b/src/IdentityPlus/Facade/Users/UserFacade.cs
@@ -1,6 +1,6 @@
-using Honamic.Framework.Commands;
+using Honamic.Framework.Applications.Results;
+using Honamic.Framework.Commands;
using Honamic.Framework.Facade;
-using Honamic.Framework.Facade.Results;
using Honamic.Framework.Queries;
using Honamic.IdentityPlus.Application.Users.Queries;
using Microsoft.Extensions.Logging;
diff --git a/src/IdentityPlus/Persistence/Honamic.IdentityPlus.Persistence.csproj b/src/IdentityPlus/Persistence/Honamic.IdentityPlus.Persistence.csproj
index fe17574..9e76f99 100644
--- a/src/IdentityPlus/Persistence/Honamic.IdentityPlus.Persistence.csproj
+++ b/src/IdentityPlus/Persistence/Honamic.IdentityPlus.Persistence.csproj
@@ -7,8 +7,8 @@
-
-
+
+
diff --git a/src/IdentityPlus/Razor/Users/List.razor b/src/IdentityPlus/Razor/Users/List.razor
index 23fd0f2..e7113e8 100644
--- a/src/IdentityPlus/Razor/Users/List.razor
+++ b/src/IdentityPlus/Razor/Users/List.razor
@@ -1,6 +1,6 @@
@inject IStringLocalizer L
@page "/Users/list"
-@using Honamic.Framework.Facade.Results
+@using Honamic.Framework.Applications.Results
@using Honamic.Framework.Queries
@using Honamic.IdentityPlus.Application.Users.Queries
Users
diff --git a/src/IdentityPlus/WebApi/Users/AccountController.cs b/src/IdentityPlus/WebApi/Users/AccountController.cs
index 8ef777c..8f30f2d 100644
--- a/src/IdentityPlus/WebApi/Users/AccountController.cs
+++ b/src/IdentityPlus/WebApi/Users/AccountController.cs
@@ -1,4 +1,4 @@
-using Honamic.Framework.Facade.Results;
+using Honamic.Framework.Applications.Results;
using Honamic.Framework.Facade.Web.Results;
using Honamic.IdentityPlus.Application.Accounts.Commands;
using Honamic.IdentityPlus.Application.Accounts.Commands.Register;
diff --git a/src/IdentityPlus/WebApi/Users/UserController.cs b/src/IdentityPlus/WebApi/Users/UserController.cs
index 94544d0..2cadabe 100644
--- a/src/IdentityPlus/WebApi/Users/UserController.cs
+++ b/src/IdentityPlus/WebApi/Users/UserController.cs
@@ -1,4 +1,4 @@
-using Honamic.Framework.Facade.Results;
+using Honamic.Framework.Applications.Results;
using Honamic.Framework.Queries;
using Honamic.IdentityPlus.Application.Users.Queries;
using Honamic.IdentityPlus.Facade.Accounts;
diff --git a/src/Tools/Honamic.Framework.Tools.IdGenerators/Honamic.Framework.Tools.IdGenerators.csproj b/src/Tools/Honamic.Framework.Tools.IdGenerators/Honamic.Framework.Tools.IdGenerators.csproj
index 53b275e..4d70089 100644
--- a/src/Tools/Honamic.Framework.Tools.IdGenerators/Honamic.Framework.Tools.IdGenerators.csproj
+++ b/src/Tools/Honamic.Framework.Tools.IdGenerators/Honamic.Framework.Tools.IdGenerators.csproj
@@ -8,9 +8,9 @@
-
+
-
+
diff --git a/src/Utilities/Web/Honamic.Framework.Utilities.Web.csproj b/src/Utilities/Web/Honamic.Framework.Utilities.Web.csproj
index 9e27e34..d974b3c 100644
--- a/src/Utilities/Web/Honamic.Framework.Utilities.Web.csproj
+++ b/src/Utilities/Web/Honamic.Framework.Utilities.Web.csproj
@@ -7,7 +7,7 @@
-
+