Skip to content

Commit 4b2b6c1

Browse files
committed
Use IoC container for JavaScript engine registrations
1 parent 9532f47 commit 4b2b6c1

File tree

4 files changed

+54
-55
lines changed

4 files changed

+54
-55
lines changed

src/React.JavaScriptEngine.VroomJs/AssemblyRegistration.cs

+5-1
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,12 @@ public void Register(TinyIoCContainer container)
2828
return;
2929
}
3030

31-
JavaScriptEngineFactory.AddFactoryWithPriority(() => new VroomJsEngine(), priority: 10);
3231
VroomJsUtils.EnsureEngineFunctional();
32+
container.Register(new JavaScriptEngineFactory.Registration
33+
{
34+
Factory = () => new VroomJsEngine(),
35+
Priority = 10
36+
}, "VroomJs");
3337
}
3438
}
3539
}

src/React.Tests/Core/JavaScriptEngineFactoryTest.cs

+16-12
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,25 @@ namespace React.Tests.Core
1717
[TestFixture]
1818
public class JavaScriptEngineFactoryTest
1919
{
20-
static JavaScriptEngineFactoryTest()
20+
private JavaScriptEngineFactory CreateFactory()
2121
{
22-
// TODO: Make this nicer
23-
JavaScriptEngineFactory.AddFactoryWithPriority(() =>
22+
var registration = new JavaScriptEngineFactory.Registration
2423
{
25-
var mockJsEngine = new Mock<IJsEngine>();
26-
mockJsEngine.Setup(x => x.Evaluate<int>("1 + 1")).Returns(2);
27-
return mockJsEngine.Object;
28-
}, 1);
24+
Factory = () =>
25+
{
26+
var mockJsEngine = new Mock<IJsEngine>();
27+
mockJsEngine.Setup(x => x.Evaluate<int>("1 + 1")).Returns(2);
28+
return mockJsEngine.Object;
29+
},
30+
Priority = 1
31+
};
32+
return new JavaScriptEngineFactory(new[] { registration });
2933
}
3034

3135
[Test]
3236
public void ShouldCallOnNewEngineWhenCreatingNew()
3337
{
34-
var factory = new JavaScriptEngineFactory();
38+
var factory = CreateFactory();
3539
var called = false;
3640
factory.GetEngineForCurrentThread(engine =>
3741
{
@@ -46,7 +50,7 @@ public void ShouldCallOnNewEngineWhenCreatingNew()
4650
[Test]
4751
public void ShouldNotCallOnNewEngineWhenUsingExisting()
4852
{
49-
var factory = new JavaScriptEngineFactory();
53+
var factory = CreateFactory();
5054
var called = false;
5155
factory.GetEngineForCurrentThread();
5256
factory.GetEngineForCurrentThread(engine => { called = true; });
@@ -58,7 +62,7 @@ public void ShouldNotCallOnNewEngineWhenUsingExisting()
5862
[Test]
5963
public void ShouldReturnSameEngine()
6064
{
61-
var factory = new JavaScriptEngineFactory();
65+
var factory = CreateFactory();
6266
var engine1 = factory.GetEngineForCurrentThread();
6367
var engine2 = factory.GetEngineForCurrentThread();
6468

@@ -69,7 +73,7 @@ public void ShouldReturnSameEngine()
6973
[Test]
7074
public void ShouldReturnNewEngineAfterDisposing()
7175
{
72-
var factory = new JavaScriptEngineFactory();
76+
var factory = CreateFactory();
7377
var engine1 = factory.GetEngineForCurrentThread();
7478
factory.DisposeEngineForCurrentThread();
7579
var engine2 = factory.GetEngineForCurrentThread();
@@ -81,7 +85,7 @@ public void ShouldReturnNewEngineAfterDisposing()
8185
[Test]
8286
public void ShouldCreateNewEngineForNewThread()
8387
{
84-
var factory = new JavaScriptEngineFactory();
88+
var factory = CreateFactory();
8589
var engine1 = factory.GetEngineForCurrentThread();
8690

8791
IJsEngine engine2 = null;

src/React/AssemblyRegistration.cs

+15-12
Original file line numberDiff line numberDiff line change
@@ -42,18 +42,21 @@ public void Register(TinyIoCContainer container)
4242
container.Register<IJavaScriptEngineFactory, JavaScriptEngineFactory>().AsPerRequestSingleton();
4343

4444
// JavaScript engines
45-
JavaScriptEngineFactory.AddFactoryWithPriority(
46-
() => new MsieJsEngine(new MsieConfiguration { EngineMode = JsEngineMode.ChakraActiveScript }),
47-
priority: 10
48-
);
49-
JavaScriptEngineFactory.AddFactoryWithPriority(
50-
() => new MsieJsEngine(new MsieConfiguration { EngineMode = JsEngineMode.Classic }),
51-
priority: 20
52-
);
53-
JavaScriptEngineFactory.AddFactoryWithPriority(
54-
() => new JintJsEngine(),
55-
priority: 100
56-
);
45+
container.Register(new JavaScriptEngineFactory.Registration
46+
{
47+
Factory = () => new MsieJsEngine(new MsieConfiguration { EngineMode = JsEngineMode.ChakraActiveScript }),
48+
Priority = 10
49+
}, "MsieChakra");
50+
container.Register(new JavaScriptEngineFactory.Registration
51+
{
52+
Factory = () => new MsieJsEngine(new MsieConfiguration { EngineMode = JsEngineMode.Classic }),
53+
Priority = 20
54+
}, "MsieClassic");
55+
container.Register(new JavaScriptEngineFactory.Registration
56+
{
57+
Factory = () => new JintJsEngine(),
58+
Priority = 100
59+
}, "Jint");
5760
}
5861
}
5962
}

src/React/JavaScriptEngineFactory.cs

+18-30
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,6 @@ namespace React
1515
public class JavaScriptEngineFactory : IDisposable, IJavaScriptEngineFactory
1616
{
1717
/// <summary>
18-
/// List of all available JavaScript engines
19-
/// </summary>
20-
private static readonly IList<FactoryWithPriority> _availableFactories
21-
= new List<FactoryWithPriority>();
22-
/// <summary>
2318
/// Function used to create new JavaScript engine instances.
2419
/// </summary>
2520
private readonly Func<IJsEngine> _factory;
@@ -32,28 +27,9 @@ private readonly ConcurrentDictionary<int, IJsEngine> _engines
3227
/// <summary>
3328
/// Initializes a new instance of the <see cref="JavaScriptEngineFactory"/> class.
3429
/// </summary>
35-
public JavaScriptEngineFactory()
30+
public JavaScriptEngineFactory(IEnumerable<Registration> availableFactories)
3631
{
37-
_factory = GetFactory();
38-
}
39-
40-
/// <summary>
41-
/// Adds a supported JavaScript engine. When an instance of
42-
/// <see cref="JavaScriptEngineFactory" /> is created, the first functioning JavaScript
43-
/// engine with the lowest priority will be used.
44-
/// </summary>
45-
/// <param name="factory">Factory method to create new instance of the engine</param>
46-
/// <param name="priority">
47-
/// Any number. All engines will be sorted by priority, so "better" engines should have
48-
/// a lower priority number.
49-
/// </param>
50-
public static void AddFactoryWithPriority(Func<IJsEngine> factory, int priority)
51-
{
52-
_availableFactories.Add(new FactoryWithPriority
53-
{
54-
Factory = factory,
55-
Priority = priority
56-
});
32+
_factory = GetFactory(availableFactories);
5733
}
5834

5935
/// <summary>
@@ -93,12 +69,13 @@ public void DisposeEngineForCurrentThread()
9369
}
9470

9571
/// <summary>
96-
/// Gets a factory for the most appropriate JavaScript engine for the current environment
72+
/// Gets a factory for the most appropriate JavaScript engine for the current environment.
73+
/// The first functioning JavaScript engine with the lowest priority will be used.
9774
/// </summary>
9875
/// <returns>Function to create JavaScript engine</returns>
99-
private static Func<IJsEngine> GetFactory()
76+
private static Func<IJsEngine> GetFactory(IEnumerable<Registration> availableFactories)
10077
{
101-
var availableEngineFactories = _availableFactories
78+
var availableEngineFactories = availableFactories
10279
.OrderBy(x => x.Priority)
10380
.Select(x => x.Factory);
10481
foreach (var engineFactory in availableEngineFactories)
@@ -146,9 +123,20 @@ public void Dispose()
146123
}
147124
}
148125

149-
private class FactoryWithPriority
126+
/// <summary>
127+
/// Represents a factory for a supported JavaScript engine.
128+
/// </summary>
129+
public class Registration
150130
{
131+
/// <summary>
132+
/// Gets or sets the factory for this JavaScript engine
133+
/// </summary>
151134
public Func<IJsEngine> Factory { get; set; }
135+
136+
/// <summary>
137+
/// Gets or sets the priority for this JavaScript engine. Engines with lower priority
138+
/// are preferred.
139+
/// </summary>
152140
public int Priority { get; set; }
153141
}
154142
}

0 commit comments

Comments
 (0)