-
Notifications
You must be signed in to change notification settings - Fork 3
/
Interception.cs
65 lines (58 loc) · 2.46 KB
/
Interception.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// ReSharper disable UnusedVariable
namespace IoC.Tests.UsageScenarios
{
using System.Collections.Generic;
using Castle.DynamicProxy;
using Features;
using Shouldly;
using Xunit;
public class Interception
{
[Fact]
// $visible=true
// $tag=5 Advanced
// $priority=10
// $description=Interception
// $header=The _Interception_ feature allows specifying the set of bindings that will be used to produce instances wrapped by proxy objects. These proxy objects intercept any invocations to the created (or injected) instances and allow to add any logic around it: checking arguments, logging, thread safety, authorization aspects and etc.
// {
// To use this feature please add the NuGet package https://www.nuget.org/packages/IoC.Interception
// or https://www.nuget.org/packages/IoC.Interception.Source
public void Run()
{
var methods = new List<string>();
using var container = Container
// Creates the Inversion of Control container
.Create()
// Using the feature InterceptionFeature
.Using<InterceptionFeature>()
// Configures binds
.Bind<IDependency>().To<Dependency>()
.Bind<IService>().To<Service>()
// Intercepts any invocations
.Intercept(key => true, new MyInterceptor(methods))
.Container;
// Resolve an instance
var instance = container.Resolve<IService>();
// Invoke the getter "get_State"
var state = instance.State;
instance.Dependency.Index = 1;
// Check invocations by our interceptor
methods.ShouldContain("get_State");
methods.ShouldContain("set_Index");
}
// This interceptor just stores names of called methods
public class MyInterceptor : IInterceptor
{
private readonly ICollection<string> _methods;
// Stores the collection of called method names
public MyInterceptor(ICollection<string> methods) => _methods = methods;
// Intercepts the invocations and appends the called method name to the collection
public void Intercept(IInvocation invocation)
{
_methods.Add(invocation.Method.Name);
invocation.Proceed();
}
}
// }
}
}