/// <summary> /// 绑定一个方法 /// </summary> /// <param name="method">通过这个名字可以调用方法</param> /// <param name="target">方法调用目标</param> /// <param name="methodInfo">在方法调用目标中被调用的方法</param> /// <returns></returns> public IMethodBind Bind(string method, object target, MethodInfo methodInfo) { Guard.NotEmptyOrNull(method, nameof(method)); Guard.Requires <ArgumentNullException>(methodInfo != null); if (!methodInfo.IsStatic) { Guard.Requires <ArgumentNullException>(target != null); } lock (syncRoot) { if (methodMappings.ContainsKey(method)) { throw new LogicException($"Method [{method}] is already {nameof(Bind)}"); } var methodBind = new MethodBind(this, container, method, target, methodInfo); methodMappings[method] = methodBind; if (target == null) { return(methodBind); } if (!targetToMethodsMappings.TryGetValue(target, out List <string> targetMappings)) { targetToMethodsMappings[target] = targetMappings = new List <string>(); } targetMappings.Add(method); return(methodBind); } }
/// <summary> /// 解除绑定 /// </summary> /// <param name="methodBind">方法绑定</param> internal void Unbind(MethodBind methodBind) { lock (syncRoot) { methodMappings.Remove(methodBind.Service); if (methodBind.Target == null) { return; } List <string> methods; if (!targetToMethodsMappings.TryGetValue(methodBind.Target, out methods)) { return; } methods.Remove(methodBind.Service); if (methods.Count <= 0) { targetToMethodsMappings.Remove(methodBind.Target); } } }