-
Notifications
You must be signed in to change notification settings - Fork 49
Expand file tree
/
Copy pathJsEngineSwitcher.cs
More file actions
154 lines (129 loc) · 3.48 KB
/
JsEngineSwitcher.cs
File metadata and controls
154 lines (129 loc) · 3.48 KB
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
using System;
using JavaScriptEngineSwitcher.Core.Resources;
namespace JavaScriptEngineSwitcher.Core
{
/// <summary>
/// JS engine switcher
/// </summary>
public sealed class JsEngineSwitcher : IJsEngineSwitcher
{
/// <summary>
/// Flag for whether to allow usage of the <see cref="Current"/> property
/// </summary>
private static bool _allowCurrentProperty = true;
/// <summary>
/// Default instance of JS engine switcher
/// </summary>
private static readonly Lazy<IJsEngineSwitcher> _default
= new Lazy<IJsEngineSwitcher>(() => new JsEngineSwitcher());
/// <summary>
/// Current instance of JS engine switcher
/// </summary>
private static IJsEngineSwitcher _current;
/// <summary>
/// Gets or sets a flag for whether to allow usage of the <see cref="Current"/> property
/// </summary>
/// <remarks>
/// Required to ensure the usage of an instance of the JS engine switcher that is registered by using
/// the <c>IServiceCollection</c> interface.
/// </remarks>
public static bool AllowCurrentProperty
{
get { return _allowCurrentProperty; }
set { _allowCurrentProperty = value; }
}
/// <summary>
/// Gets or sets a instance of JS engine switcher
/// </summary>
public static IJsEngineSwitcher Current
{
get
{
if (!_allowCurrentProperty)
{
throw new InvalidOperationException(
Strings.Configuration_GettingFromJsEngineSwitcherCurrentPropertyForbidden);
}
return _current ?? _default.Value;
}
set
{
if (!_allowCurrentProperty)
{
throw new InvalidOperationException(
Strings.Configuration_AssigningToJsEngineSwitcherCurrentPropertyForbidden);
}
_current = value;
}
}
/// <summary>
/// Gets a instance of JS engine switcher
/// </summary>
[Obsolete("Use a `Current` property")]
public static IJsEngineSwitcher Instance
{
get { return Current; }
}
/// <summary>
/// Constructs an instance of JS engine switcher
/// </summary>
public JsEngineSwitcher()
: this(new JsEngineFactoryCollection())
{ }
/// <summary>
/// Constructs an instance of JS engine switcher
/// </summary>
public JsEngineSwitcher(JsEngineFactoryCollection engineFactories)
: this(engineFactories, string.Empty)
{ }
/// <summary>
/// Constructs an instance of JS engine switcher
/// </summary>
public JsEngineSwitcher(JsEngineFactoryCollection engineFactories, string defaultEngineName)
{
EngineFactories = engineFactories;
DefaultEngineName = defaultEngineName;
}
#region IJsEngineSwitcher implementation
/// <inheritdoc/>
public string DefaultEngineName
{
get;
set;
}
/// <inheritdoc/>
public JsEngineFactoryCollection EngineFactories
{
get;
private set;
}
/// <inheritdoc/>
public IJsEngine CreateEngine(string name)
{
IJsEngine engine;
IJsEngineFactory engineFactory = EngineFactories.Get(name);
if (engineFactory is not null)
{
engine = engineFactory.CreateEngine();
}
else
{
throw new JsEngineNotFoundException(
string.Format(Strings.Configuration_JsEngineFactoryNotFound, name));
}
return engine;
}
/// <inheritdoc/>
public IJsEngine CreateDefaultEngine()
{
string defaultJsEngineName = DefaultEngineName;
if (string.IsNullOrWhiteSpace(defaultJsEngineName))
{
throw new InvalidOperationException(Strings.Configuration_DefaultJsEngineNameNotSpecified);
}
IJsEngine jsEngine = CreateEngine(defaultJsEngineName);
return jsEngine;
}
#endregion
}
}