tsioc
Version:
tsioc is AOP, Ioc container, via typescript decorator
120 lines (118 loc) • 5.79 kB
JavaScript
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
Object.defineProperty(exports, "__esModule", { value: true });
var index_1 = require("../../core/index");
var index_2 = require("../joinpoints/index");
var index_3 = require("../joinpoints/index");
var index_4 = require("../../utils/index");
var ProxyMethod = /** @class */ (function () {
function ProxyMethod(container) {
this.container = container;
}
Object.defineProperty(ProxyMethod.prototype, "aspectMgr", {
get: function () {
if (!this._aspectMgr) {
this._aspectMgr = this.container.get(index_4.symbols.IAdvisor);
}
return this._aspectMgr;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ProxyMethod.prototype, "liefScope", {
get: function () {
if (!this._liefScope) {
this._liefScope = this.container.getLifeScope();
}
return this._liefScope;
},
enumerable: true,
configurable: true
});
ProxyMethod.prototype.proceed = function (target, targetType, pointcut, provJoinpoint) {
var aspectMgr = this.aspectMgr;
var fullName = pointcut.fullName;
var methodName = pointcut.name;
var advices = aspectMgr.getAdvices(fullName);
if (advices && pointcut) {
if (pointcut.descriptor && (pointcut.descriptor.get || pointcut.descriptor.set)) {
if (pointcut.descriptor.get) {
var getMethod = pointcut.descriptor.get.bind(target);
pointcut.descriptor.get = this.proxy(getMethod, advices, target, targetType, pointcut, provJoinpoint);
}
if (pointcut.descriptor.set) {
var setMethod = pointcut.descriptor.set.bind(target);
pointcut.descriptor.set = this.proxy(setMethod, advices, target, targetType, pointcut, provJoinpoint);
}
Object.defineProperty(target, methodName, pointcut.descriptor);
}
else if (index_4.isFunction(target[methodName])) {
var propertyMethod = target[methodName].bind(target);
target[methodName] = this.proxy(propertyMethod, advices, target, targetType, pointcut, provJoinpoint);
}
}
};
ProxyMethod.prototype.proxy = function (propertyMethod, advices, target, targetType, pointcut, provJoinpoint) {
var _this = this;
var aspectMgr = this.aspectMgr;
var fullName = pointcut.fullName;
var methodName = pointcut.name;
var liefScope = this.liefScope;
var container = this.container;
return function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var joinPoint = _this.container.resolve(index_3.Joinpoint, index_1.Provider.create('options', {
name: methodName,
fullName: fullName,
provJoinpoint: provJoinpoint,
annotations: provJoinpoint ? null : liefScope.getMethodMetadatas(targetType, methodName),
params: liefScope.getMethodParameters(targetType, target, methodName),
args: args,
target: target,
targetType: targetType
}));
var adChain = container.resolve(index_4.symbols.IAdvisorChainFactory, { container: container, advices: advices });
adChain.invoaction(joinPoint, index_2.JoinpointState.Before);
adChain.invoaction(joinPoint, index_2.JoinpointState.Pointcut);
var val, exeErr;
try {
val = propertyMethod.apply(void 0, joinPoint.args);
}
catch (err) {
exeErr = err;
}
adChain.invoaction(joinPoint, index_2.JoinpointState.After, val);
if (exeErr) {
adChain.invoaction(joinPoint, index_2.JoinpointState.AfterThrowing, exeErr);
}
else {
adChain.invoaction(joinPoint, index_2.JoinpointState.AfterReturning, val);
return joinPoint.returning;
}
};
};
ProxyMethod.classAnnations = { "name": "ProxyMethod", "params": { "constructor": ["container"], "proceed": ["target", "targetType", "pointcut", "provJoinpoint"], "proxy": ["propertyMethod", "advices", "target", "targetType", "pointcut", "provJoinpoint"] } };
ProxyMethod = __decorate([
index_1.NonePointcut(),
index_1.Singleton(index_4.symbols.IProxyMethod),
__param(0, index_1.Inject(index_4.symbols.IContainer)),
__metadata("design:paramtypes", [Object])
], ProxyMethod);
return ProxyMethod;
}());
exports.ProxyMethod = ProxyMethod;
//# sourceMappingURL=../sourcemaps/access/ProxyMethod.js.map