19. listopadu 2007

JavaScript a Dependency Injection

Všichni jste už asi slyšeli o Spring IoC, Picocontaineru, HaveMindu či Tapestry IoC. Ale což takhle IoC pro JavaScript?

Ano je to možné. Jmenuje se Squirel Ioc. Jedná se o velmi jednoduchou knihovna, která má 4kB a používá jQuery.

Použití je velmi jednoduché (jak už se v mých příspěvcích stalo pravidlem). Máme následující třídy, které budeme propojovat:


function MyModel(){
//obsah třídy MyModel
}

function MyDAO(model){
var _model=model;

this.get = function() {
return _model;
}

this.save = function() {
//uloz
}

this.delete = function() {
//smaz
}
}

function MyService(){
var _dao = null;

this.get = function() {
return _dao.get();
}

this.getDao = function() {
return _dao;
}

this.setDao = function(dao) {
_dao = dao;
}
}

function MyApp(){
var _service=null;
//rikame IoC containeru, ze az vse nastavi, ma zavolat metodu onContextSupport
ContainerSupport.call(this);

this.onContextSupport = function(containerContext){
var model=_service.get();
//udelej cokoliv dalsiho s hodnotou ...
}

this.setService = function(service){
_service = service;
}
}
Z pohledu IoC v Javě máme POJO objekty a teď je potřebuje spolu nějak svázat (ve Springu se k tomu např. používá xml soubor nebo anotace). Při použití Squirrel IoC nám poslouží velmi jednoduchý kód:
var definition={
'model':{type:MyModel},
'dao':{type:MyDAO,args:[{ref:'model'}]},
'service':{type:MyService,props:[{name:'dao',ref:'dao'}]},
'app':{type:MyApp,props:[{name:'containerContext',ref:'containerContext'},{ref:'service'}]}
};


var container = new IContainer();
container.load(definition);
V příkladu je vidět constructor injection (na příkladu definice dao objektu) či setter injection (na příkladu objektu service).

Když to funguje v Javě, proč ne v JavaScriptu. Opět se ukazuje jednoduchost, kterou nám JavaScript jako dynamický jazyk nabízí. A příště až budete potřebovat propojit pár objektů mezi sebou, zamyslete se, zda vám Squirrel Ioc neusnadní práci.

Žádné komentáře: