Skip to content

Commit 5618a7a

Browse files
committed
Rewrite activation to make inheritance not insane
1 parent 44cd26c commit 5618a7a

File tree

2 files changed

+19
-29
lines changed

2 files changed

+19
-29
lines changed

ReactiveUI.Tests/ActivationTest.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ public class ActivatingViewModel : ReactiveObject, ISupportsActivation
1919

2020
public ActivatingViewModel()
2121
{
22-
Activator = this.WhenActivated(d => {
22+
Activator = new ViewModelActivator();
23+
24+
this.WhenActivated(d => {
2325
IsActiveCount++;
2426
d(Disposable.Create(() => IsActiveCount--));
2527
});
@@ -32,7 +34,7 @@ public class DerivedActivatingViewModel : ActivatingViewModel
3234

3335
public DerivedActivatingViewModel()
3436
{
35-
Activator = this.WhenActivated(d => {
37+
this.WhenActivated(d => {
3638
IsActiveCountAlso++;
3739
d(Disposable.Create(() => IsActiveCountAlso--));
3840
});

ReactiveUI/Activation.cs

Lines changed: 15 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,26 @@
1212

1313
namespace ReactiveUI
1414
{
15-
public class ViewModelActivator
15+
public sealed class ViewModelActivator
1616
{
17-
readonly Func<IEnumerable<IDisposable>> block;
17+
readonly List<Func<IEnumerable<IDisposable>>> blocks;
1818
IDisposable activationHandle = Disposable.Empty;
1919

20-
public ViewModelActivator(Func<IEnumerable<IDisposable>> block)
20+
public ViewModelActivator()
2121
{
22-
this.block = block;
22+
blocks = new List<Func<IEnumerable<IDisposable>>>();
23+
}
24+
25+
internal void addActivationBlock(Func<IEnumerable<IDisposable>> block)
26+
{
27+
blocks.Add(block);
2328
}
2429

2530
public IDisposable Activate()
2631
{
27-
var disp = new CompositeDisposable(block());
28-
Interlocked.Exchange(ref activationHandle, disp).Dispose();
32+
var disp = new CompositeDisposable(blocks.SelectMany(x => x()));
2933

34+
Interlocked.Exchange(ref activationHandle, disp).Dispose();
3035
return Disposable.Create(Deactivate);
3136
}
3237

@@ -38,33 +43,16 @@ public void Deactivate()
3843

3944
public static class ViewForMixins
4045
{
41-
public static ViewModelActivator WhenActivated(this ISupportsActivation This, Func<IEnumerable<IDisposable>> block)
46+
public static void WhenActivated(this ISupportsActivation This, Func<IEnumerable<IDisposable>> block)
4247
{
43-
var activator = This.Activator;
44-
45-
return new ViewModelActivator(() =>{
46-
var list = block().ToList();
47-
48-
if (activator != null) {
49-
list.Add(activator.Activate());
50-
}
51-
52-
return list;
53-
});
48+
This.Activator.addActivationBlock(block);
5449
}
5550

56-
public static ViewModelActivator WhenActivated(this ISupportsActivation This, Action<Action<IDisposable>> block)
51+
public static void WhenActivated(this ISupportsActivation This, Action<Action<IDisposable>> block)
5752
{
58-
var activator = This.Activator;
59-
60-
return new ViewModelActivator(() => {
53+
This.Activator.addActivationBlock(() => {
6154
var ret = new List<IDisposable>();
6255
block(ret.Add);
63-
64-
if (activator != null) {
65-
ret.Add(activator.Activate());
66-
}
67-
6856
return ret;
6957
});
7058
}

0 commit comments

Comments
 (0)