在Python中可以很方便的使用装饰器实现简单的依赖注入。
资料如下:
http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html
顺便做了一个拦截器。可以注入前置函数。
import functools
funcs_config = {}
class FuncInjectItem(object):
def __init__(self):
self.func = None
self.args = ()
self.func_type = "simple"
class FuncInfo(object):
def __init__(self):
self.args = None
self.kwargs = None
self.func = None
def inject(some_func):
@functools.wraps(some_func)
def wrap(*args, **kwargs):
if some_func.__name__ in funcs_config:
before_funcs = funcs_config[some_func.__name__]
for item in before_funcs:
if item.func_type == "simple":
item.func(*item.args)
return some_func(*args, **kwargs)
if item.func_type == "normal":
func_info = FuncInfo()
func_info.args = args
func_info.kwargs = kwargs
func_info.func = some_func
item.func(func_info, *item.args)
return func_info.func(*func_info.args, **func_info.kwargs)
else:
return some_func(*args, **kwargs)
return wrap
def __register(target, func, func_type, args):
inject_item = FuncInjectItem()
inject_item.func = func
inject_item.args = args
inject_item.func_type = func_type
if target.__name__ in funcs_config:
func_array = funcs_config[target.__name__]
for item in func_array:
if item.func.__name__ == func.__name__:
print("func is already exist")
return
func_array.append(inject_item)
else:
func_array = [inject_item]
funcs_config[target.__name__] = func_array
def register(target, func, args):
__register(target, func, "simple", args)
def register_normal(target, func, args):
__register(target, func, "normal", args)