1
1
using System ;
2
2
using System . Collections . Generic ;
3
+ using System . Runtime . Serialization ;
4
+ using System . Security ;
5
+ using System . Security . Permissions ;
3
6
using NHibernate . Util ;
4
7
5
8
namespace NHibernate . Engine
@@ -77,12 +80,53 @@ public static CascadeStyle GetCascadeStyle(string cascade)
77
80
return style ;
78
81
}
79
82
83
+ private static void RunTypeConstructor ( )
84
+ {
85
+ // No code needed.
86
+ }
87
+
80
88
#endregion
81
89
82
90
#region The CascadeStyle implementations
83
91
84
92
[ Serializable ]
85
- private class AllDeleteOrphanCascadeStyle : CascadeStyle
93
+ private abstract class SingletonCascadeStyle < TConcrete > : CascadeStyle , ISerializable
94
+ where TConcrete : class , new ( )
95
+ {
96
+ public static readonly TConcrete Instance = new TConcrete ( ) ;
97
+
98
+ #if NET_4_0
99
+ [ SecurityCritical ]
100
+ #else
101
+ [ SecurityPermission ( SecurityAction . LinkDemand , Flags = SecurityPermissionFlag . SerializationFormatter ) ]
102
+ #endif
103
+ public void GetObjectData ( SerializationInfo info , StreamingContext context )
104
+ {
105
+ // Don't serialize the real object, that could cause multiple objects of the same
106
+ // singleton type after deserialization.
107
+ info . SetType ( typeof ( CascadeStyleReference ) ) ;
108
+ }
109
+
110
+ [ Serializable ]
111
+ private sealed class CascadeStyleReference : IObjectReference
112
+ {
113
+ #if NET_4_0
114
+ [ SecurityCritical ]
115
+ #endif
116
+ public Object GetRealObject ( StreamingContext context )
117
+ {
118
+ // First make sure that the type constructor of the base class was already executed.
119
+ // If this isn't the case 'Instance' can't be constructed and will stay null.
120
+ CascadeStyle . RunTypeConstructor ( ) ;
121
+
122
+ // Return the singleton instance of this CascadeStyle.
123
+ return Instance ;
124
+ }
125
+ }
126
+ }
127
+
128
+ [ Serializable ]
129
+ private class AllDeleteOrphanCascadeStyle : SingletonCascadeStyle < AllDeleteOrphanCascadeStyle >
86
130
{
87
131
public override bool DoCascade ( CascadingAction action )
88
132
{
@@ -95,7 +139,7 @@ public override bool HasOrphanDelete
95
139
}
96
140
97
141
[ Serializable ]
98
- private class AllCascadeStyle : CascadeStyle
142
+ private class AllCascadeStyle : SingletonCascadeStyle < AllCascadeStyle >
99
143
{
100
144
public override bool DoCascade ( CascadingAction action )
101
145
{
@@ -104,7 +148,7 @@ public override bool DoCascade(CascadingAction action)
104
148
}
105
149
106
150
[ Serializable ]
107
- private class UpdateCascadeStyle : CascadeStyle
151
+ private class UpdateCascadeStyle : SingletonCascadeStyle < UpdateCascadeStyle >
108
152
{
109
153
public override bool DoCascade ( CascadingAction action )
110
154
{
@@ -113,7 +157,7 @@ public override bool DoCascade(CascadingAction action)
113
157
}
114
158
115
159
[ Serializable ]
116
- private class LockCascadeStyle : CascadeStyle
160
+ private class LockCascadeStyle : SingletonCascadeStyle < LockCascadeStyle >
117
161
{
118
162
public override bool DoCascade ( CascadingAction action )
119
163
{
@@ -122,7 +166,7 @@ public override bool DoCascade(CascadingAction action)
122
166
}
123
167
124
168
[ Serializable ]
125
- private class RefreshCascadeStyle : CascadeStyle
169
+ private class RefreshCascadeStyle : SingletonCascadeStyle < RefreshCascadeStyle >
126
170
{
127
171
public override bool DoCascade ( CascadingAction action )
128
172
{
@@ -131,7 +175,7 @@ public override bool DoCascade(CascadingAction action)
131
175
}
132
176
133
177
[ Serializable ]
134
- private class EvictCascadeStyle : CascadeStyle
178
+ private class EvictCascadeStyle : SingletonCascadeStyle < EvictCascadeStyle >
135
179
{
136
180
public override bool DoCascade ( CascadingAction action )
137
181
{
@@ -140,7 +184,7 @@ public override bool DoCascade(CascadingAction action)
140
184
}
141
185
142
186
[ Serializable ]
143
- private class ReplicateCascadeStyle : CascadeStyle
187
+ private class ReplicateCascadeStyle : SingletonCascadeStyle < ReplicateCascadeStyle >
144
188
{
145
189
public override bool DoCascade ( CascadingAction action )
146
190
{
@@ -149,7 +193,7 @@ public override bool DoCascade(CascadingAction action)
149
193
}
150
194
151
195
[ Serializable ]
152
- private class MergeCascadeStyle : CascadeStyle
196
+ private class MergeCascadeStyle : SingletonCascadeStyle < MergeCascadeStyle >
153
197
{
154
198
public override bool DoCascade ( CascadingAction action )
155
199
{
@@ -158,7 +202,7 @@ public override bool DoCascade(CascadingAction action)
158
202
}
159
203
160
204
[ Serializable ]
161
- private class PersistCascadeStyle : CascadeStyle
205
+ private class PersistCascadeStyle : SingletonCascadeStyle < PersistCascadeStyle >
162
206
{
163
207
public override bool DoCascade ( CascadingAction action )
164
208
{
@@ -167,7 +211,7 @@ public override bool DoCascade(CascadingAction action)
167
211
}
168
212
169
213
[ Serializable ]
170
- private class DeleteCascadeStyle : CascadeStyle
214
+ private class DeleteCascadeStyle : SingletonCascadeStyle < DeleteCascadeStyle >
171
215
{
172
216
public override bool DoCascade ( CascadingAction action )
173
217
{
@@ -176,7 +220,7 @@ public override bool DoCascade(CascadingAction action)
176
220
}
177
221
178
222
[ Serializable ]
179
- private class DeleteOrphanCascadeStyle : CascadeStyle
223
+ private class DeleteOrphanCascadeStyle : SingletonCascadeStyle < DeleteOrphanCascadeStyle >
180
224
{
181
225
public override bool DoCascade ( CascadingAction action )
182
226
{
@@ -195,7 +239,7 @@ public override bool HasOrphanDelete
195
239
}
196
240
197
241
[ Serializable ]
198
- private class NoneCascadeStyle : CascadeStyle
242
+ private class NoneCascadeStyle : SingletonCascadeStyle < NoneCascadeStyle >
199
243
{
200
244
public override bool DoCascade ( CascadingAction action )
201
245
{
@@ -251,40 +295,40 @@ public override string ToString()
251
295
}
252
296
253
297
/// <summary> save / delete / update / evict / lock / replicate / merge / persist + delete orphans</summary>
254
- public static readonly CascadeStyle AllDeleteOrphan = new AllDeleteOrphanCascadeStyle ( ) ;
298
+ public static readonly CascadeStyle AllDeleteOrphan = AllDeleteOrphanCascadeStyle . Instance ;
255
299
256
300
/// <summary> save / delete / update / evict / lock / replicate / merge / persist</summary>
257
- public static readonly CascadeStyle All = new AllCascadeStyle ( ) ;
301
+ public static readonly CascadeStyle All = AllCascadeStyle . Instance ;
258
302
259
303
/// <summary> save / update</summary>
260
- public static readonly CascadeStyle Update = new UpdateCascadeStyle ( ) ;
304
+ public static readonly CascadeStyle Update = UpdateCascadeStyle . Instance ;
261
305
262
306
/// <summary> lock</summary>
263
- public static readonly CascadeStyle Lock = new LockCascadeStyle ( ) ;
307
+ public static readonly CascadeStyle Lock = LockCascadeStyle . Instance ;
264
308
265
309
/// <summary> refresh</summary>
266
- public static readonly CascadeStyle Refresh = new RefreshCascadeStyle ( ) ;
310
+ public static readonly CascadeStyle Refresh = RefreshCascadeStyle . Instance ;
267
311
268
312
/// <summary> evict</summary>
269
- public static readonly CascadeStyle Evict = new EvictCascadeStyle ( ) ;
313
+ public static readonly CascadeStyle Evict = EvictCascadeStyle . Instance ;
270
314
271
315
/// <summary> replicate</summary>
272
- public static readonly CascadeStyle Replicate = new ReplicateCascadeStyle ( ) ;
316
+ public static readonly CascadeStyle Replicate = ReplicateCascadeStyle . Instance ;
273
317
274
318
/// <summary> merge</summary>
275
- public static readonly CascadeStyle Merge = new MergeCascadeStyle ( ) ;
319
+ public static readonly CascadeStyle Merge = MergeCascadeStyle . Instance ;
276
320
277
321
/// <summary> create</summary>
278
- public static readonly CascadeStyle Persist = new PersistCascadeStyle ( ) ;
322
+ public static readonly CascadeStyle Persist = PersistCascadeStyle . Instance ;
279
323
280
324
/// <summary> delete</summary>
281
- public static readonly CascadeStyle Delete = new DeleteCascadeStyle ( ) ;
325
+ public static readonly CascadeStyle Delete = DeleteCascadeStyle . Instance ;
282
326
283
327
/// <summary> delete + delete orphans</summary>
284
- public static readonly CascadeStyle DeleteOrphan = new DeleteOrphanCascadeStyle ( ) ;
328
+ public static readonly CascadeStyle DeleteOrphan = DeleteOrphanCascadeStyle . Instance ;
285
329
286
330
/// <summary> no cascades</summary>
287
- public static readonly CascadeStyle None = new NoneCascadeStyle ( ) ;
331
+ public static readonly CascadeStyle None = NoneCascadeStyle . Instance ;
288
332
289
333
#endregion
290
334
}
0 commit comments