From 18fe28aabf1d191bcbd4dea62456554724525de2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=96=B5=E5=96=B5=E5=A4=A7=E4=BA=BA?= Date: Tue, 6 Feb 2018 11:17:27 +0800 Subject: [PATCH 1/7] OnResolving optimization --- .../CatLib.Core.NetStandard.csproj | 1 + .../Properties/AssemblyInfo.cs | 4 +- .../Support/Container/BindDataTests.cs | 19 ++++++- .../Support/Container/ContainerTests.cs | 5 +- src/CatLib.Core/CatLib.Core.csproj | 1 + src/CatLib.Core/CatLib/App.cs | 20 +++++++ src/CatLib.Core/CatLib/Application.cs | 2 +- src/CatLib.Core/Properties/AssemblyInfo.cs | 4 +- .../Support/Container/BindDataExtend.cs | 52 +++++++++++++++++++ .../Support/Container/ContainerExtend.cs | 28 ++++++++++ 10 files changed, 129 insertions(+), 7 deletions(-) create mode 100644 src/CatLib.Core/Support/Container/BindDataExtend.cs diff --git a/src/CatLib.Core.NetStandard/CatLib.Core.NetStandard.csproj b/src/CatLib.Core.NetStandard/CatLib.Core.NetStandard.csproj index 8d4a8d8..41d3e86 100644 --- a/src/CatLib.Core.NetStandard/CatLib.Core.NetStandard.csproj +++ b/src/CatLib.Core.NetStandard/CatLib.Core.NetStandard.csproj @@ -67,6 +67,7 @@ + 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..07e28f6 100644 --- a/src/CatLib.Core.Tests/Support/Container/BindDataTests.cs +++ b/src/CatLib.Core.Tests/Support/Container/BindDataTests.cs @@ -132,6 +132,12 @@ public void CanOnRelease() Assert.AreSame(bindData, bind); }); + // double check + bindData.OnRelease((bind, obj) => + { + Assert.AreEqual("Test", obj); + }); + container.Instance("CanAddOnRelease", "Test"); container.Release("CanAddOnRelease"); } @@ -151,7 +157,7 @@ public void CheckIllegalRelease() ExceptionAssert.Throws(() => { - bindData.OnRelease((bind, obj) => + bindData.OnRelease((obj) => { Assert.Fail(); }); @@ -163,6 +169,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/ContainerTests.cs b/src/CatLib.Core.Tests/Support/Container/ContainerTests.cs index 0af74b7..f1ef12f 100644 --- a/src/CatLib.Core.Tests/Support/Container/ContainerTests.cs +++ b/src/CatLib.Core.Tests/Support/Container/ContainerTests.cs @@ -1016,9 +1016,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 +2264,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..18ba6fe 100644 --- a/src/CatLib.Core/CatLib.Core.csproj +++ b/src/CatLib.Core/CatLib.Core.csproj @@ -46,6 +46,7 @@ + diff --git a/src/CatLib.Core/CatLib/App.cs b/src/CatLib.Core/CatLib/App.cs index 74b5a5a..ade0361 100644 --- a/src/CatLib.Core/CatLib/App.cs +++ b/src/CatLib.Core/CatLib/App.cs @@ -1147,6 +1147,26 @@ public static Func Factory(params object[] userParams) return () => Make(userParams); } + /// + /// 当静态服务被释放时 + /// + /// 处理释放时的回调 + /// 当前容器实例 + public static IContainer OnRelease(Action callback) + { + return Handler.OnRelease(callback); + } + + /// + /// 当服务被解决时,生成的服务会经过注册的回调函数 + /// + /// 回调函数 + /// 当前容器对象 + public static IContainer OnResolving(Action callback) + { + return Handler.OnResolving(callback); + } + /// /// 关注指定的服务,当服务触发重定义时调用指定对象的指定方法 /// 调用是以依赖注入的形式进行的 diff --git a/src/CatLib.Core/CatLib/Application.cs b/src/CatLib.Core/CatLib/Application.cs index 9f93629..5da89b8 100644 --- a/src/CatLib.Core/CatLib/Application.cs +++ b/src/CatLib.Core/CatLib/Application.cs @@ -24,7 +24,7 @@ public class Application : Container, IApplication /// /// 版本号 /// - private readonly Version version = new Version("1.2.1"); + private readonly Version version = new Version("1.2.2"); /// /// 框架启动流程 diff --git a/src/CatLib.Core/Properties/AssemblyInfo.cs b/src/CatLib.Core/Properties/AssemblyInfo.cs index 3aa7d16..6d514b6 100644 --- a/src/CatLib.Core/Properties/AssemblyInfo.cs +++ b/src/CatLib.Core/Properties/AssemblyInfo.cs @@ -26,8 +26,8 @@ [assembly: Guid("4204658e-81fd-4106-a347-890cd369c8a4")] -[assembly: AssemblyVersion("1.2.1.0")] -[assembly: AssemblyFileVersion("1.2.1.0")] +[assembly: AssemblyVersion("1.2.2.0")] +[assembly: AssemblyFileVersion("1.2.2.0")] [assembly: InternalsVisibleTo("Assembly-CSharp-Editor"), InternalsVisibleTo("Assembly-CSharp-Editor-firstpass"), diff --git a/src/CatLib.Core/Support/Container/BindDataExtend.cs b/src/CatLib.Core/Support/Container/BindDataExtend.cs new file mode 100644 index 0000000..06fa20d --- /dev/null +++ b/src/CatLib.Core/Support/Container/BindDataExtend.cs @@ -0,0 +1,52 @@ +/* + * This file is part of the CatLib package. + * + * (c) Yu Bin + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + * Document: http://catlib.io/ + */ + +using System; + +namespace CatLib +{ + /// + /// 绑定数据拓展 + /// + public static class BindDataExtend + { + /// + /// 解决服务时触发的回调 + /// + /// 绑定数据 + /// 解决事件 + /// 服务绑定数据 + public static IBindData OnResolving(this IBindData bindData, Action action) + { + Guard.Requires(action != null); + return bindData.OnResolving((_, instance) => + { + action(instance); + return instance; + }); + } + + /// + /// 当静态服务被释放时 + /// + /// 绑定数据 + /// 处理事件 + /// 服务绑定数据 + public static IBindData OnRelease(this IBindData bindData, Action action) + { + Guard.Requires(action != null); + return bindData.OnRelease((_, instance) => + { + action(instance); + }); + } + } +} diff --git a/src/CatLib.Core/Support/Container/ContainerExtend.cs b/src/CatLib.Core/Support/Container/ContainerExtend.cs index 3c7d923..1f5f0a0 100644 --- a/src/CatLib.Core/Support/Container/ContainerExtend.cs +++ b/src/CatLib.Core/Support/Container/ContainerExtend.cs @@ -650,6 +650,34 @@ public static Func Factory(this IContainer container, params return () => (TService)container.Make(container.Type2Service(typeof(TService)), userParams); } + /// + /// 当静态服务被释放时 + /// + /// 服务容器 + /// 处理释放时的回调 + /// 当前容器实例 + public static IContainer OnRelease(this IContainer container, Action callback) + { + Guard.Requires(callback != null); + return container.OnRelease((_, instance) => callback(instance)); + } + + /// + /// 当服务被解决时,生成的服务会经过注册的回调函数 + /// + /// 服务容器 + /// 回调函数 + /// 当前容器对象 + public static IContainer OnResolving(this IContainer container, Action callback) + { + Guard.Requires(callback != null); + return container.OnResolving((_, instance) => + { + callback(instance); + return instance; + }); + } + /// /// 关注指定的服务,当服务触发重定义时调用指定对象的指定方法 /// 调用是以依赖注入的形式进行的 From d655ad8696d5c92dd35bbf391438650752ffd6af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=96=B5=E5=96=B5=E5=A4=A7=E4=BA=BA?= Date: Tue, 6 Feb 2018 11:30:51 +0800 Subject: [PATCH 2/7] OnRelease optimization --- .../Support/Container/BindDataTests.cs | 13 ++++++++++--- .../Support/Container/BindDataExtend.cs | 15 +++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/CatLib.Core.Tests/Support/Container/BindDataTests.cs b/src/CatLib.Core.Tests/Support/Container/BindDataTests.cs index 07e28f6..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) => { @@ -133,13 +133,20 @@ public void CanOnRelease() }); // double check - bindData.OnRelease((bind, obj) => + 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); } /// /// 检查无效的解决事件传入参数 @@ -148,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(() => { diff --git a/src/CatLib.Core/Support/Container/BindDataExtend.cs b/src/CatLib.Core/Support/Container/BindDataExtend.cs index 06fa20d..5ea0efc 100644 --- a/src/CatLib.Core/Support/Container/BindDataExtend.cs +++ b/src/CatLib.Core/Support/Container/BindDataExtend.cs @@ -48,5 +48,20 @@ public static IBindData OnRelease(this IBindData bindData, Action action action(instance); }); } + + /// + /// 当静态服务被释放时 + /// + /// 绑定数据 + /// 处理事件 + /// 服务绑定数据 + public static IBindData OnRelease(this IBindData bindData, Action action) + { + Guard.Requires(action != null); + return bindData.OnRelease((_, __) => + { + action(); + }); + } } } From 3562c87eb035c4d6ecd78321222e0486b55b32f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=96=B5=E5=96=B5=E5=A4=A7=E4=BA=BA?= Date: Mon, 12 Feb 2018 17:25:59 +0800 Subject: [PATCH 3/7] Facade optimization --- src/CatLib.Core/CatLib/App.cs | 2 +- src/CatLib.Core/CatLib/Facade.cs | 17 +++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/CatLib.Core/CatLib/App.cs b/src/CatLib.Core/CatLib/App.cs index ade0361..72322e0 100644 --- a/src/CatLib.Core/CatLib/App.cs +++ b/src/CatLib.Core/CatLib/App.cs @@ -359,7 +359,7 @@ public static bool HasBind(string service) /// 是否已经静态化 public static bool HasInstance() { - return Handler.HasInstance(); + return Facade.HasInstance || Handler.HasInstance(); } /// diff --git a/src/CatLib.Core/CatLib/Facade.cs b/src/CatLib.Core/CatLib/Facade.cs index 3455bc9..eb486c4 100644 --- a/src/CatLib.Core/CatLib/Facade.cs +++ b/src/CatLib.Core/CatLib/Facade.cs @@ -65,6 +65,16 @@ public static TService Instance get { return Make(); } } + /// + /// 是否拥有门面实例 + /// 如果为非静态绑定那么永远返回false + /// 门面实例判断不能代替:Container.HasInstance + /// + internal static bool HasInstance + { + get { return binder != null && binder.IsStatic && !released && instance != null; } + } + /// /// 构建一个服务实例 /// @@ -72,12 +82,7 @@ public static TService Instance /// 服务实例 internal static TService Make(params object[] userParams) { - if (binder != null && binder.IsStatic && !released && instance != null) - { - return instance; - } - - return Resolve(userParams); + return HasInstance ? instance : Resolve(userParams); } /// From 1f206767301624e40992377e0521ff2ae8e855c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=96=B5=E5=96=B5=E5=A4=A7=E4=BA=BA?= Date: Mon, 12 Feb 2018 17:37:29 +0800 Subject: [PATCH 4/7] add CATLIB_PERFORMANCE flag to optimization code --- .../CatLib.Core.NetStandard.csproj | 2 +- src/CatLib.Core/CatLib.Core.csproj | 2 +- src/CatLib.Core/CatLib/App.cs | 14 +++++++++++--- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/CatLib.Core.NetStandard/CatLib.Core.NetStandard.csproj b/src/CatLib.Core.NetStandard/CatLib.Core.NetStandard.csproj index 41d3e86..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 diff --git a/src/CatLib.Core/CatLib.Core.csproj b/src/CatLib.Core/CatLib.Core.csproj index 18ba6fe..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 diff --git a/src/CatLib.Core/CatLib/App.cs b/src/CatLib.Core/CatLib/App.cs index 72322e0..b0920f7 100644 --- a/src/CatLib.Core/CatLib/App.cs +++ b/src/CatLib.Core/CatLib/App.cs @@ -359,7 +359,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 +658,9 @@ public static string Type2Service(Type type) { return Handler.Type2Service(type); } - #endregion +#endregion - #region Container Extend API +#region Container Extend API /// /// 获取服务的绑定数据,如果绑定不存在则返回null /// @@ -1123,7 +1127,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 } /// @@ -1233,6 +1241,6 @@ public static string Type2Service() { return Handler.Type2Service(); } - #endregion +#endregion } } \ No newline at end of file From 99ad7e2a9ed417996e61ee7cecce498b378f9d74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=96=B5=E5=96=B5=E5=A4=A7=E4=BA=BA?= Date: Tue, 13 Feb 2018 11:49:14 +0800 Subject: [PATCH 5/7] add Terminate function --- .../CatLib/ApplicationTests.cs | 22 +++++++++++ src/CatLib.Core/CatLib/App.cs | 8 ++++ src/CatLib.Core/CatLib/Application.cs | 38 +++++++++++++++---- src/CatLib.Core/CatLib/ApplicationEvents.cs | 10 +++++ src/CatLib.Core/CatLib/IApplication.cs | 5 +++ 5 files changed, 76 insertions(+), 7 deletions(-) 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/CatLib/App.cs b/src/CatLib.Core/CatLib/App.cs index b0920f7..c1af12a 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(); + } + /// /// 注册服务提供者 /// diff --git a/src/CatLib.Core/CatLib/Application.cs b/src/CatLib.Core/CatLib/Application.cs index 5da89b8..1d2f3b6 100644 --- a/src/CatLib.Core/CatLib/Application.cs +++ b/src/CatLib.Core/CatLib/Application.cs @@ -55,6 +55,16 @@ public enum StartProcess /// 初始化完成 /// Inited = 4, + + /// + /// 框架终止之前 + /// + Terminate = 5, + + /// + /// 框架终止之后 + /// + Terminated = 6, } /// @@ -91,6 +101,7 @@ public StartProcess Process { return process; } + private set { process = value; } } /// @@ -143,13 +154,26 @@ public Application() DebugLevel = DebugLevels.Prod; } + /// + /// 终止CatLib框架 + /// + public virtual void Terminate() + { + Process = StartProcess.Terminate; + Trigger(ApplicationEvents.OnTerminate, this); + Flush(); + App.Handler = null; + Process = StartProcess.Terminated; + Trigger(ApplicationEvents.OnTerminated, this); + } + /// /// 引导程序 /// /// 引导程序 /// CatLib实例 /// 当引导类型为null时引发 - public void Bootstrap(params IBootstrap[] bootstraps) + public virtual void Bootstrap(params IBootstrap[] bootstraps) { Guard.Requires(bootstraps != null); @@ -158,7 +182,7 @@ public void Bootstrap(params IBootstrap[] bootstraps) return; } - process = StartProcess.Bootstrap; + Process = StartProcess.Bootstrap; var sorting = new SortSet(); @@ -175,7 +199,7 @@ public void Bootstrap(params IBootstrap[] bootstraps) } } - process = StartProcess.Bootstraped; + Process = StartProcess.Bootstraped; bootstrapped = true; Trigger(ApplicationEvents.OnBootstraped, this); } @@ -184,7 +208,7 @@ public void Bootstrap(params IBootstrap[] bootstraps) /// 初始化 /// /// 没有调用Bootstrap(...)就尝试初始化时触发 - public void Init() + public virtual void Init() { if (!bootstrapped) { @@ -196,7 +220,7 @@ public void Init() return; } - process = StartProcess.Initing; + Process = StartProcess.Initing; foreach (var provider in serviceProviders) { @@ -205,7 +229,7 @@ public void Init() } inited = true; - process = StartProcess.Inited; + Process = StartProcess.Inited; Trigger(ApplicationEvents.OnStartCompleted, this); } @@ -215,7 +239,7 @@ public void Init() /// /// 注册服务提供者 /// 服务提供者被重复注册时触发 - public void Register(IServiceProvider provider) + public virtual void Register(IServiceProvider provider) { Guard.Requires(provider != null); diff --git a/src/CatLib.Core/CatLib/ApplicationEvents.cs b/src/CatLib.Core/CatLib/ApplicationEvents.cs index 421b13c..12d9145 100644 --- a/src/CatLib.Core/CatLib/ApplicationEvents.cs +++ b/src/CatLib.Core/CatLib/ApplicationEvents.cs @@ -30,5 +30,15 @@ public sealed class ApplicationEvents /// 当程序启动完成 /// public static readonly string OnStartCompleted = "CatLib.ApplicationEvents.OnStartCompleted"; + + /// + /// 当程序终止之前 + /// + public static readonly string OnTerminate = "CatLib.ApplicationEvents.OnTerminate"; + + /// + /// 当程序终止之后 + /// + public static readonly string OnTerminated = "CatLib.ApplicationEvents.OnTerminated"; } } \ No newline at end of file diff --git a/src/CatLib.Core/CatLib/IApplication.cs b/src/CatLib.Core/CatLib/IApplication.cs index 24e9626..f0fa1cd 100644 --- a/src/CatLib.Core/CatLib/IApplication.cs +++ b/src/CatLib.Core/CatLib/IApplication.cs @@ -82,5 +82,10 @@ public interface IApplication : IContainer, IDispatcher /// 调试等级 /// DebugLevels DebugLevel { get; set; } + + /// + /// 终止CatLib框架 + /// + void Terminate(); } } From e9e8ba0f7ba9cf2d9e590f0e6fa8b06ab246afb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=96=B5=E5=96=B5=E5=A4=A7=E4=BA=BA?= Date: Tue, 13 Feb 2018 13:56:35 +0800 Subject: [PATCH 6/7] tag optimization --- .../Support/Container/ContainerHelperTests.cs | 9 ++++ .../Support/Container/ContainerTests.cs | 1 + src/CatLib.Core/CatLib/App.cs | 20 +++++++++ .../Support/Container/ContainerExtend.cs | 41 +++++++++++++++++++ 4 files changed, 71 insertions(+) diff --git a/src/CatLib.Core.Tests/Support/Container/ContainerHelperTests.cs b/src/CatLib.Core.Tests/Support/Container/ContainerHelperTests.cs index ffd2ab0..201c8af 100644 --- a/src/CatLib.Core.Tests/Support/Container/ContainerHelperTests.cs +++ b/src/CatLib.Core.Tests/Support/Container/ContainerHelperTests.cs @@ -309,6 +309,15 @@ 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)); + } + /// /// 生成容器 /// diff --git a/src/CatLib.Core.Tests/Support/Container/ContainerTests.cs b/src/CatLib.Core.Tests/Support/Container/ContainerTests.cs index f1ef12f..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"); }); } diff --git a/src/CatLib.Core/CatLib/App.cs b/src/CatLib.Core/CatLib/App.cs index c1af12a..45e52a0 100644 --- a/src/CatLib.Core/CatLib/App.cs +++ b/src/CatLib.Core/CatLib/App.cs @@ -1016,6 +1016,16 @@ public static void Unbind() Handler.Unbind(); } + /// + /// 为一个服务定义一个标记 + /// + /// 服务 + /// 标记名 + public static void Tag(string tag) + { + Handler.Tag(tag); + } + /// /// 静态化一个服务,实例值会经过解决修饰器 /// @@ -1035,6 +1045,16 @@ public static bool Release() return Handler.Release(); } + /// + /// 根据实例对象释放静态化实例 + /// + /// 需要释放静态化实例对象 + /// 只要有一个没有释放成功那么返回false + public static bool Release(params object[] instances) + { + return Handler.Release(instances); + } + /// /// 以依赖注入形式调用一个方法 /// diff --git a/src/CatLib.Core/Support/Container/ContainerExtend.cs b/src/CatLib.Core/Support/Container/ContainerExtend.cs index 1f5f0a0..5e205c7 100644 --- a/src/CatLib.Core/Support/Container/ContainerExtend.cs +++ b/src/CatLib.Core/Support/Container/ContainerExtend.cs @@ -456,6 +456,17 @@ public static void Unbind(this IContainer container) container.Unbind(container.Type2Service(typeof(TService))); } + /// + /// 为一个服务定义一个标记 + /// + /// 服务 + /// 服务容器 + /// 标记名 + public static void Tag(this IContainer container, string tag) + { + container.Tag(tag, container.Type2Service(typeof(TService))); + } + /// /// 静态化一个服务,实例值会经过解决修饰器 /// @@ -477,6 +488,36 @@ public static bool Release(this IContainer container) return container.Release(container.Type2Service(typeof(TService))); } + /// + /// 根据实例对象释放静态化实例 + /// + /// 服务容器 + /// 需要释放静态化实例对象 + /// 只要有一个没有释放成功那么返回false + public static bool Release(this IContainer container, params object[] instances) + { + if (instances == null) + { + return false; + } + + var released = true; + foreach (var instance in instances) + { + if (instance == null) + { + continue; + } + + if (!container.Release(container.Type2Service(instance.GetType()))) + { + released = false; + } + } + + return released; + } + /// /// 以依赖注入的形式调用一个方法 /// From 47891ae90d0a01254c891fdfbb9d758e9ab83c3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=96=B5=E5=96=B5=E5=A4=A7=E4=BA=BA?= Date: Tue, 13 Feb 2018 14:10:29 +0800 Subject: [PATCH 7/7] update unittest --- .../Support/Container/ContainerHelperTests.cs | 2 ++ src/CatLib.Core/Support/Container/ContainerExtend.cs | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/CatLib.Core.Tests/Support/Container/ContainerHelperTests.cs b/src/CatLib.Core.Tests/Support/Container/ContainerHelperTests.cs index 201c8af..727ce14 100644 --- a/src/CatLib.Core.Tests/Support/Container/ContainerHelperTests.cs +++ b/src/CatLib.Core.Tests/Support/Container/ContainerHelperTests.cs @@ -316,6 +316,8 @@ public void TestReleaseWithObject() 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/Support/Container/ContainerExtend.cs b/src/CatLib.Core/Support/Container/ContainerExtend.cs index 5e205c7..321c754 100644 --- a/src/CatLib.Core/Support/Container/ContainerExtend.cs +++ b/src/CatLib.Core/Support/Container/ContainerExtend.cs @@ -496,12 +496,12 @@ public static bool Release(this IContainer container) /// 只要有一个没有释放成功那么返回false public static bool Release(this IContainer container, params object[] instances) { + var released = true; if (instances == null) { - return false; + return released; } - var released = true; foreach (var instance in instances) { if (instance == null)