Skip to content

Commit c36e958

Browse files
committed
resolved #84
1 parent 4105657 commit c36e958

File tree

4 files changed

+375
-0
lines changed

4 files changed

+375
-0
lines changed

src/CatLib.Core.Tests/Support/Container/BindDataTests.cs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,70 @@ public void CheckIllegalResolving()
240240
bindData.OnResolving(null);
241241
});
242242
}
243+
244+
[TestMethod]
245+
public void TestTypeMatchOnResolving()
246+
{
247+
var container = new Container();
248+
var count = 0;
249+
container.Bind("hello", (_, __) => new ContainerHelperTests.TestTypeMatchOnResolvingClass())
250+
.OnResolving<ContainerHelperTests.ITypeMatchInterface>((instance) =>
251+
{
252+
count++;
253+
}).OnResolving<ContainerHelperTests.ITypeMatchInterface>((bindData, instance) =>
254+
{
255+
Assert.AreNotEqual(null, bindData);
256+
count++;
257+
}).OnAfterResolving<ContainerHelperTests.ITypeMatchInterface>((instance) =>
258+
{
259+
count++;
260+
}).OnAfterResolving<ContainerHelperTests.ITypeMatchInterface>((bindData, instance) =>
261+
{
262+
Assert.AreNotEqual(null, bindData);
263+
count++;
264+
}).OnAfterResolving<Container>((instance) =>
265+
{
266+
count++;
267+
});
268+
269+
container.Make("hello");
270+
271+
Assert.AreEqual(4, count);
272+
}
273+
274+
[TestMethod]
275+
public void TestTypeMatchOnRelease()
276+
{
277+
var container = new Container();
278+
var count = 0;
279+
container.Singleton("hello", (_, __) => new ContainerHelperTests.TestTypeMatchOnResolvingClass())
280+
.OnRelease<ContainerHelperTests.ITypeMatchInterface>((instance) =>
281+
{
282+
count++;
283+
}).OnRelease<Container>((instance) =>
284+
{
285+
count++;
286+
}).OnRelease<ContainerHelperTests.ITypeMatchInterface>((bindData,instance) =>
287+
{
288+
Assert.AreNotEqual(null, bindData);
289+
count++;
290+
}).OnRelease<Container>((bindData, instance) =>
291+
{
292+
Assert.AreNotEqual(null, bindData);
293+
count++;
294+
}).OnRelease<string>((bindData, instance) =>
295+
{
296+
Assert.AreNotEqual(null, bindData);
297+
count++;
298+
});
299+
container.Singleton("world", (_, __) => "hello");
300+
301+
container.Make("hello");
302+
303+
container.Release("hello");
304+
305+
Assert.AreEqual(2, count);
306+
}
243307
#endregion
244308

245309
#region Unbind

src/CatLib.Core.Tests/Support/Container/ContainerHelperTests.cs

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,91 @@ public void TestExtendContainer()
406406
Assert.AreEqual("hello world", container.Make<string>());
407407
}
408408

409+
public interface ITypeMatchInterface
410+
{
411+
412+
}
413+
414+
public class TestTypeMatchOnResolvingClass : ITypeMatchInterface
415+
{
416+
417+
}
418+
419+
[TestMethod]
420+
public void TestTypeMatchOnResolving()
421+
{
422+
var container = new Container();
423+
container.Bind("hello", (_, __) => new TestTypeMatchOnResolvingClass());
424+
container["world"] = "hello";
425+
var count = 0;
426+
container.OnResolving<ITypeMatchInterface>((instance) =>
427+
{
428+
count++;
429+
});
430+
431+
container.OnResolving<ITypeMatchInterface>((bindData, instance) =>
432+
{
433+
Assert.AreNotEqual(null, bindData);
434+
count++;
435+
});
436+
437+
container.OnAfterResolving<ITypeMatchInterface>((instance) =>
438+
{
439+
count++;
440+
});
441+
442+
container.OnAfterResolving<ITypeMatchInterface>((bindData,instance) =>
443+
{
444+
Assert.AreNotEqual(null, bindData);
445+
count++;
446+
});
447+
448+
container.Make("hello");
449+
container.Make("world");
450+
451+
Assert.AreEqual(4, count);
452+
}
453+
454+
[TestMethod]
455+
public void TestTypeMatchOnRelease()
456+
{
457+
var container = new Container();
458+
container.Singleton("hello", (_, __) => new TestTypeMatchOnResolvingClass());
459+
container.Singleton("world", (_, __) => "hello");
460+
var count = 0;
461+
var stringCount = 0;
462+
container.OnRelease<ITypeMatchInterface>((instance) =>
463+
{
464+
count++;
465+
});
466+
467+
container.OnRelease<ITypeMatchInterface>((bindData, instance) =>
468+
{
469+
Assert.AreNotEqual(null, bindData);
470+
count++;
471+
});
472+
473+
container.OnRelease<string>((instance) =>
474+
{
475+
stringCount++;
476+
});
477+
478+
container.OnRelease<string>((bindData, instance) =>
479+
{
480+
Assert.AreNotEqual(null, bindData);
481+
stringCount++;
482+
});
483+
484+
container.Make("hello");
485+
container.Make("world");
486+
487+
container.Release("hello");
488+
container.Release("world");
489+
490+
Assert.AreEqual(2, count);
491+
Assert.AreEqual(2, stringCount);
492+
}
493+
409494
/// <summary>
410495
/// 生成容器
411496
/// </summary>

src/CatLib.Core/Support/Container/BindDataExtend.cs

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,44 @@ public static IBindData OnResolving(this IBindData bindData, Action<object> acti
3333
});
3434
}
3535

36+
/// <summary>
37+
/// 解决服务时触发的回调
38+
/// </summary>
39+
/// <typeparam name="T">指定的类型</typeparam>
40+
/// <param name="bindData">绑定数据</param>
41+
/// <param name="closure">闭包</param>
42+
/// <returns>服务绑定数据</returns>
43+
public static IBindData OnResolving<T>(this IBindData bindData, Action<T> closure)
44+
{
45+
Guard.Requires<ArgumentNullException>(closure != null);
46+
return bindData.OnResolving((_, instance) =>
47+
{
48+
if (instance is T)
49+
{
50+
closure((T)instance);
51+
}
52+
});
53+
}
54+
55+
/// <summary>
56+
/// 解决服务时触发的回调
57+
/// </summary>
58+
/// <typeparam name="T">指定的类型</typeparam>
59+
/// <param name="bindData">绑定数据</param>
60+
/// <param name="closure">闭包</param>
61+
/// <returns>服务绑定数据</returns>
62+
public static IBindData OnResolving<T>(this IBindData bindData, Action<IBindData, T> closure)
63+
{
64+
Guard.Requires<ArgumentNullException>(closure != null);
65+
return bindData.OnResolving((bind, instance) =>
66+
{
67+
if (instance is T)
68+
{
69+
closure(bind, (T)instance);
70+
}
71+
});
72+
}
73+
3674
/// <summary>
3775
/// 解决服务时触发的回调
3876
/// </summary>
@@ -63,6 +101,42 @@ public static IBindData OnAfterResolving(this IBindData bindData, Action<object>
63101
});
64102
}
65103

104+
/// <summary>
105+
/// 解决服务事件之后的回调
106+
/// </summary>
107+
/// <param name="bindData">绑定数据</param>
108+
/// <param name="closure">解决事件</param>
109+
/// <returns>服务绑定数据</returns>
110+
public static IBindData OnAfterResolving<T>(this IBindData bindData, Action<T> closure)
111+
{
112+
Guard.Requires<ArgumentNullException>(closure != null);
113+
return bindData.OnAfterResolving((_, instance) =>
114+
{
115+
if (instance is T)
116+
{
117+
closure((T)instance);
118+
}
119+
});
120+
}
121+
122+
/// <summary>
123+
/// 解决服务事件之后的回调
124+
/// </summary>
125+
/// <param name="bindData">绑定数据</param>
126+
/// <param name="closure">解决事件</param>
127+
/// <returns>服务绑定数据</returns>
128+
public static IBindData OnAfterResolving<T>(this IBindData bindData, Action<IBindData, T> closure)
129+
{
130+
Guard.Requires<ArgumentNullException>(closure != null);
131+
return bindData.OnAfterResolving((bind, instance) =>
132+
{
133+
if (instance is T)
134+
{
135+
closure(bind, (T)instance);
136+
}
137+
});
138+
}
139+
66140
/// <summary>
67141
/// 解决服务事件之后的回调
68142
/// </summary>
@@ -93,6 +167,42 @@ public static IBindData OnRelease(this IBindData bindData, Action<object> action
93167
});
94168
}
95169

170+
/// <summary>
171+
/// 当静态服务被释放时
172+
/// </summary>
173+
/// <param name="bindData">绑定数据</param>
174+
/// <param name="closure">处理事件</param>
175+
/// <returns>服务绑定数据</returns>
176+
public static IBindData OnRelease<T>(this IBindData bindData, Action<T> closure)
177+
{
178+
Guard.Requires<ArgumentNullException>(closure != null);
179+
return bindData.OnRelease((_, instance) =>
180+
{
181+
if (instance is T)
182+
{
183+
closure((T)instance);
184+
}
185+
});
186+
}
187+
188+
/// <summary>
189+
/// 当静态服务被释放时
190+
/// </summary>
191+
/// <param name="bindData">绑定数据</param>
192+
/// <param name="closure">处理事件</param>
193+
/// <returns>服务绑定数据</returns>
194+
public static IBindData OnRelease<T>(this IBindData bindData, Action<IBindData, T> closure)
195+
{
196+
Guard.Requires<ArgumentNullException>(closure != null);
197+
return bindData.OnRelease((bind, instance) =>
198+
{
199+
if (instance is T)
200+
{
201+
closure(bind, (T)instance);
202+
}
203+
});
204+
}
205+
96206
/// <summary>
97207
/// 当静态服务被释放时
98208
/// </summary>

0 commit comments

Comments
 (0)