diff --git a/src/CatLib.Core.NetStandard/CatLib.Core.NetStandard.csproj b/src/CatLib.Core.NetStandard/CatLib.Core.NetStandard.csproj
index 8d4a8d8..31b2042 100644
--- a/src/CatLib.Core.NetStandard/CatLib.Core.NetStandard.csproj
+++ b/src/CatLib.Core.NetStandard/CatLib.Core.NetStandard.csproj
@@ -41,7 +41,7 @@
..\..\build\NetStandard2.0\
..\..\build\NetStandard2.0\netstandard2.0\CatLib.Core.xml
- TRACE;RELEASE;NETSTANDARD2_0;CATLIB;RELEASE;NETSTANDARD2_0
+ TRACE;CATLIB;CATLIB_PERFORMANCE;RELEASE;NETSTANDARD2_0;RELEASE;NETSTANDARD2_0;RELEASE;NETSTANDARD2_0
@@ -67,6 +67,7 @@
+
diff --git a/src/CatLib.Core.Tests/CatLib/ApplicationTests.cs b/src/CatLib.Core.Tests/CatLib/ApplicationTests.cs
index 7be5d7d..db48dbc 100644
--- a/src/CatLib.Core.Tests/CatLib/ApplicationTests.cs
+++ b/src/CatLib.Core.Tests/CatLib/ApplicationTests.cs
@@ -106,6 +106,28 @@ public void NoBootstrapInit()
});
}
+ ///
+ /// 测试终止程序
+ ///
+ [TestMethod]
+ public void TestTerminate()
+ {
+ var app = new Application();
+ var oldApp = App.Handler;
+ var num = 0;
+ oldApp.On(ApplicationEvents.OnTerminate, () =>
+ {
+ Assert.AreEqual(0, num++);
+ });
+ oldApp.On(ApplicationEvents.OnTerminated, () =>
+ {
+ Assert.AreEqual(1, num++);
+ });
+ App.Terminate();
+ Assert.AreNotEqual(oldApp, App.Handler);
+ Assert.AreEqual(2, num);
+ }
+
///
/// 获取版本号测试
///
diff --git a/src/CatLib.Core.Tests/Properties/AssemblyInfo.cs b/src/CatLib.Core.Tests/Properties/AssemblyInfo.cs
index 55b2209..c7469b8 100644
--- a/src/CatLib.Core.Tests/Properties/AssemblyInfo.cs
+++ b/src/CatLib.Core.Tests/Properties/AssemblyInfo.cs
@@ -25,5 +25,5 @@
[assembly: Guid("3c9f4024-910c-4881-a04d-34a6c3a09019")]
-[assembly: AssemblyVersion("1.2.1.0")]
-[assembly: AssemblyFileVersion("1.2.1.0")]
+[assembly: AssemblyVersion("1.2.2.0")]
+[assembly: AssemblyFileVersion("1.2.2.0")]
diff --git a/src/CatLib.Core.Tests/Support/Container/BindDataTests.cs b/src/CatLib.Core.Tests/Support/Container/BindDataTests.cs
index 627abc4..da4261f 100644
--- a/src/CatLib.Core.Tests/Support/Container/BindDataTests.cs
+++ b/src/CatLib.Core.Tests/Support/Container/BindDataTests.cs
@@ -124,7 +124,7 @@ public void CheckIllegalAlias()
public void CanOnRelease()
{
var container = new Container();
- var bindData = new BindData(container, "CanAddOnRelease", (app, param) => "hello world", true);
+ var bindData = container.Bind("CanAddOnRelease", (app, param) => "hello world", true);
bindData.OnRelease((bind, obj) =>
{
@@ -132,8 +132,21 @@ public void CanOnRelease()
Assert.AreSame(bindData, bind);
});
+ // double check
+ bindData.OnRelease((obj) =>
+ {
+ Assert.AreEqual("Test", obj);
+ });
+
+ var isCall = false;
+ bindData.OnRelease(()=>
+ {
+ isCall = true;
+ });
+
container.Instance("CanAddOnRelease", "Test");
container.Release("CanAddOnRelease");
+ Assert.AreEqual(true, isCall);
}
///
/// 检查无效的解决事件传入参数
@@ -142,7 +155,7 @@ public void CanOnRelease()
public void CheckIllegalRelease()
{
var container = new Container();
- var bindData = new BindData(container, "CheckIllegalRelease", (app, param) => "hello world", false);
+ var bindData = container.Bind("CheckIllegalRelease", (app, param) => "hello world", false);
ExceptionAssert.Throws(() =>
{
@@ -151,7 +164,7 @@ public void CheckIllegalRelease()
ExceptionAssert.Throws(() =>
{
- bindData.OnRelease((bind, obj) =>
+ bindData.OnRelease((obj) =>
{
Assert.Fail();
});
@@ -163,6 +176,17 @@ public void CheckIllegalRelease()
#endregion
#region OnResolving
+
+ [TestMethod]
+ public void TestAddOnResolvingWithExtend()
+ {
+ var container = new Container();
+ var bindData = new BindData(container, "CanAddOnResolving", (app, param) => "hello world", false);
+ bindData.OnResolving((obj) => Assert.AreEqual("hello world", obj));
+ var data = bindData.TriggerResolving("hello world");
+ Assert.AreEqual("hello world", data);
+ }
+
///
/// 是否能追加到解决事件
///
diff --git a/src/CatLib.Core.Tests/Support/Container/ContainerHelperTests.cs b/src/CatLib.Core.Tests/Support/Container/ContainerHelperTests.cs
index ffd2ab0..727ce14 100644
--- a/src/CatLib.Core.Tests/Support/Container/ContainerHelperTests.cs
+++ b/src/CatLib.Core.Tests/Support/Container/ContainerHelperTests.cs
@@ -309,6 +309,17 @@ public void TestWatchLambdaNoParam()
Assert.AreEqual(true, isCall);
}
+ [TestMethod]
+ public void TestReleaseWithObject()
+ {
+ var container = new Container();
+ container.Instance("abc");
+ container.Instance(10);
+ Assert.AreEqual(true, container.Release("abc", 10, null));
+ object[] data = null;
+ Assert.AreEqual(true, container.Release(data));
+ }
+
///
/// 生成容器
///
diff --git a/src/CatLib.Core.Tests/Support/Container/ContainerTests.cs b/src/CatLib.Core.Tests/Support/Container/ContainerTests.cs
index 0af74b7..cffff69 100644
--- a/src/CatLib.Core.Tests/Support/Container/ContainerTests.cs
+++ b/src/CatLib.Core.Tests/Support/Container/ContainerTests.cs
@@ -33,6 +33,7 @@ public void CanTagService()
ExceptionAssert.DoesNotThrow(() =>
{
container.Tag("TestTag", "service1", "service2");
+ container.Tag("TestTag");
});
}
@@ -1016,9 +1017,12 @@ public void CanMakeWithResolve()
bind.OnResolving((bindData, obj) => "local resolve");
container.OnResolving((bindData, obj) => obj + " global resolve");
+ var isTrigger = false;
+ container.OnResolving((obj) => isTrigger = true);
var result = container.Make(container.Type2Service(typeof(MakeTestClassDependency)));
+ Assert.AreEqual(true, isTrigger);
Assert.AreEqual("local resolve global resolve", result);
}
@@ -2261,7 +2265,7 @@ public void TestFlushAndInstance()
var container = new Application();
container.Instance(container);
- container.OnRelease((_, __) =>
+ container.OnRelease((__) =>
{
container.Instance(container);
});
diff --git a/src/CatLib.Core/CatLib.Core.csproj b/src/CatLib.Core/CatLib.Core.csproj
index 1b15f77..657a067 100644
--- a/src/CatLib.Core/CatLib.Core.csproj
+++ b/src/CatLib.Core/CatLib.Core.csproj
@@ -26,7 +26,7 @@
pdbonly
true
..\..\build\Net35\
- TRACE;CATLIB
+ TRACE;CATLIB;CATLIB_PERFORMANCE
prompt
4
true
@@ -46,6 +46,7 @@
+
diff --git a/src/CatLib.Core/CatLib/App.cs b/src/CatLib.Core/CatLib/App.cs
index 74b5a5a..45e52a0 100644
--- a/src/CatLib.Core/CatLib/App.cs
+++ b/src/CatLib.Core/CatLib/App.cs
@@ -57,6 +57,14 @@ public static IApplication Handler
#endregion
#region Application API
+ ///
+ /// 终止CatLib框架
+ ///
+ public static void Terminate()
+ {
+ Handler.Terminate();
+ }
+
///
/// 注册服务提供者
///
@@ -359,7 +367,11 @@ public static bool HasBind(string service)
/// 是否已经静态化
public static bool HasInstance()
{
+#if CATLIB_PERFORMANCE
+ return Facade.HasInstance || Handler.HasInstance();
+#else
return Handler.HasInstance();
+#endif
}
///
@@ -654,9 +666,9 @@ public static string Type2Service(Type type)
{
return Handler.Type2Service(type);
}
- #endregion
+#endregion
- #region Container Extend API
+#region Container Extend API
///
/// 获取服务的绑定数据,如果绑定不存在则返回null
///
@@ -1004,6 +1016,16 @@ public static void Unbind()
Handler.Unbind();
}
+ ///
+ /// 为一个服务定义一个标记
+ ///
+ /// 服务
+ /// 标记名
+ public static void Tag(string tag)
+ {
+ Handler.Tag(tag);
+ }
+
///
/// 静态化一个服务,实例值会经过解决修饰器
///
@@ -1023,6 +1045,16 @@ public static bool Release()
return Handler.Release();
}
+ ///
+ /// 根据实例对象释放静态化实例
+ ///
+ /// 需要释放静态化实例对象
+ /// 只要有一个没有释放成功那么返回false
+ public static bool Release(params object[] instances)
+ {
+ return Handler.Release(instances);
+ }
+
///
/// 以依赖注入形式调用一个方法
///
@@ -1123,7 +1155,11 @@ public static Action Wrap(Action method, params
/// 服务实例
public static TService Make(params object[] userParams)
{
+#if CATLIB_PERFORMANCE
return Facade.Make(userParams);
+#else
+ return Handler.Make(userParams);
+#endif
}
///
@@ -1147,6 +1183,26 @@ public static Func Factory(params object[] userParams)
return () => Make(userParams);
}
+ ///
+ /// 当静态服务被释放时
+ ///
+ /// 处理释放时的回调
+ /// 当前容器实例
+ public static IContainer OnRelease(Action