Skip to content

Commit ee68ffd

Browse files
added service registration policies
#82
1 parent c07ae10 commit ee68ffd

5 files changed

+90
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System;
2+
3+
namespace Maestro.Configuration
4+
{
5+
public interface IServiceRegistrationPolicy
6+
{
7+
void Register(Type type, IContainerBuilder builder);
8+
}
9+
}

src/Maestro/src/Configuration/ScannerExtensions.cs

+5
Original file line numberDiff line numberDiff line change
@@ -85,5 +85,10 @@ public static IScanner RegisterDefaultImplementations(this IScanner scanner, Act
8585
{
8686
return scanner.Using(new DefaultImplementationsConvention(action ?? (x => x.Add())));
8787
}
88+
89+
public static IScanner UsingRegistrationPolicies(this IScanner scanner)
90+
{
91+
return scanner.Using<RegistrationPolicyConvention>();
92+
}
8893
}
8994
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using System;
2+
3+
namespace Maestro.Configuration
4+
{
5+
[AttributeUsage(AttributeTargets.Class)]
6+
public class ServiceRegistrationPolicyAttribute : Attribute
7+
{
8+
public Type PolicyType { get; }
9+
10+
public ServiceRegistrationPolicyAttribute(Type policyType)
11+
{
12+
PolicyType = policyType;
13+
}
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using Maestro.Configuration;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Reflection;
6+
7+
namespace Maestro.Conventions
8+
{
9+
internal class ServiceRegistrationPolicyConvention : IConvention
10+
{
11+
public void Process(IEnumerable<Type> types, IContainerBuilder builder)
12+
{
13+
types.ForEach(type => type
14+
.GetCustomAttributes<ServiceRegistrationPolicyAttribute>(true)
15+
.Select(x => (IServiceRegistrationPolicy)Activator.CreateInstance(x.PolicyType))
16+
.ForEach(x => x.Register(type, builder))
17+
);
18+
}
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using Maestro.Configuration;
2+
using Shouldly;
3+
using System;
4+
using System.Linq;
5+
using System.Reflection;
6+
using Xunit;
7+
8+
namespace Maestro.Tests.Conventions
9+
{
10+
public class RegistrationPolicyTests
11+
{
12+
[Fact]
13+
public void ShouldRegisterServiceUsingPolicy()
14+
{
15+
var container = new Container(x => x.Scan(s =>
16+
{
17+
var types = GetType().GetNestedTypes(BindingFlags.NonPublic);
18+
s.Types(types).UsingRegistrationPolicies();
19+
}));
20+
21+
var service1 = container.GetService<IFoo>();
22+
var service2 = container.GetService<IFoo>();
23+
24+
service1.ShouldBeOfType<Foo>();
25+
service1.ShouldBe(service2);
26+
}
27+
28+
private interface IFoo { }
29+
30+
[ServiceRegistrationPolicy(typeof(CustomPolicy))]
31+
private class Foo : IFoo { }
32+
33+
private class CustomPolicy : IServiceRegistrationPolicy
34+
{
35+
public void Register(Type type, IContainerBuilder builder)
36+
{
37+
builder.Add(type.GetInterfaces().Single()).Type(type).Singleton();
38+
}
39+
}
40+
}
41+
}

0 commit comments

Comments
 (0)