Skip to content

Commit b23d8d4

Browse files
committed
Added Policies
1 parent 726d60c commit b23d8d4

7 files changed

Lines changed: 82 additions & 1 deletion

File tree

samples/EasyWay.Samples/Commands/SampleCommandHandler.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using EasyWay.Samples.Domain;
2+
using EasyWay.Samples.Domain.Policies;
23

34
namespace EasyWay.Samples.Commands
45
{
@@ -14,24 +15,33 @@ internal sealed class SampleCommandHandler : ICommandHandler<SampleModule, Sampl
1415

1516
private readonly IConcurrencyConflictValidator _concurrencyTokenValidator;
1617

18+
private readonly IEnumerable<ISamplePolicy> _policies;
19+
1720
public SampleCommandHandler(
1821
ICancellationContext cancellationContext,
1922
ISampleAggragateRootRepository repository,
2023
SampleAggregateRootFactory factory,
2124
SampleDomainService domainService,
22-
IConcurrencyConflictValidator concurrencyTokenValidator)
25+
IConcurrencyConflictValidator concurrencyTokenValidator,
26+
IEnumerable<ISamplePolicy> policies)
2327
{
2428
_cancellationContext = cancellationContext;
2529
_repository = repository;
2630
_factory = factory;
2731
_domainService = domainService;
2832
_concurrencyTokenValidator = concurrencyTokenValidator;
33+
_policies = policies;
2934
}
3035

3136
public async Task Handle(SampleCommand command)
3237
{
3338
var token = _cancellationContext.Token;
3439

40+
var data = _policies
41+
.Where(x => x.IsApplicable(true))
42+
.Single()
43+
.Execute("DATA");
44+
3545
var x = _factory.Create();
3646

3747
_concurrencyTokenValidator.Validate(x, command);
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
namespace EasyWay.Samples.Domain.Policies
2+
{
3+
public interface ISamplePolicy : IPolicy<bool, string, string>;
4+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace EasyWay.Samples.Domain.Policies
2+
{
3+
public sealed class SamplePolicy1 : ISamplePolicy
4+
{
5+
public string Execute(string data)
6+
{
7+
return data;
8+
}
9+
10+
public bool IsApplicable(bool data) => true;
11+
}
12+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace EasyWay.Samples.Domain.Policies
2+
{
3+
public sealed class SamplePolicy2 : ISamplePolicy
4+
{
5+
public string Execute(string data)
6+
{
7+
return data;
8+
}
9+
10+
public bool IsApplicable(bool data) => false;
11+
}
12+
}

source/EasyWay/IPolicy.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
namespace EasyWay
2+
{
3+
public interface IPolicy<TConditionalData, TInputData>
4+
{
5+
bool IsApplicable(TConditionalData data);
6+
7+
void Execute(TInputData data);
8+
}
9+
10+
public interface IPolicy<TConditionalData, TInputData, TOutputData>
11+
{
12+
bool IsApplicable(TConditionalData data);
13+
14+
TOutputData Execute(TInputData data);
15+
}
16+
}

source/EasyWay/Internals/Extensions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using EasyWay.Internals.DomainEvents;
44
using EasyWay.Internals.DomainServices;
55
using EasyWay.Internals.Factories;
6+
using EasyWay.Internals.Policies;
67
using EasyWay.Internals.Queries;
78
using EasyWay.Internals.Repositories;
89
using Microsoft.Extensions.DependencyInjection;
@@ -21,6 +22,7 @@ internal static void AddEasyWay<TModule>(this IServiceCollection services, IEnum
2122
.AddQueries<TModule>(assemblies)
2223
.AddDomainEvents(assemblies)
2324
.AddRepositories(assemblies)
25+
.AddPolicies(assemblies)
2426
.AddDomainServices(assemblies)
2527
.AddFactories(assemblies);
2628
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using Microsoft.Extensions.DependencyInjection;
2+
using System.Reflection;
3+
4+
namespace EasyWay.Internals.Policies
5+
{
6+
internal static class Extensions
7+
{
8+
internal static IServiceCollection AddPolicies(
9+
this IServiceCollection services,
10+
IEnumerable<Assembly> assemblies)
11+
{
12+
services.Scan(s => s.FromAssemblies(assemblies)
13+
.AddClasses(c => c.AssignableTo(typeof(IPolicy<,>)))
14+
.AsImplementedInterfaces()
15+
.WithTransientLifetime());
16+
17+
services.Scan(s => s.FromAssemblies(assemblies)
18+
.AddClasses(c => c.AssignableTo(typeof(IPolicy<,,>)))
19+
.AsImplementedInterfaces()
20+
.WithTransientLifetime());
21+
22+
return services;
23+
}
24+
}
25+
}

0 commit comments

Comments
 (0)