Skip to content

Instantly share code, notes, and snippets.

@rascio
Created March 22, 2014 17:17
Show Gist options
  • Save rascio/9710824 to your computer and use it in GitHub Desktop.
Save rascio/9710824 to your computer and use it in GitHub Desktop.
DI with partials
function Dispatcher(){
var handlers = {}
this.register = function(queryExecutorDescriptor){
handlers[queryExecutorDescriptor['for']] = queryExecutorDescriptor.retrieve;
}
this.dispatch = function(query, params){
var handle = handlers[query]
if (handle){
return handle(params);
}
throw new Exception(query + ' doesn\'t managed')
}
}
var dispatcher = new Dispatcher();
function findLuckyStuffs(stuffsRepository, query){
console.log(query)
return stuffsRepository.findLuckyStuffs()
}
var stuffsRepository = {
findLuckyStuffs: function(){
return ['de', 'culo']
},
findAllStuffs: function(){
return 'a lot of results'
}
}
dispatcher.register({
'for': 'LuckyStuffs',
retrieve: function dependencyInjection(message){
findLuckyStuffs(stuffsRepository, message)
}
})
console.log(dispatcher.dispatch('LuckyStuffs', 'Bucio'))
function inTransaction(queryExecutor){
var transactionOpened = false
return function(query){
transactionOpened = true
var result = queryExecutor(query)
transactionOpened = false
return result
}
}
function log(queryExecutor){
return function(message){
console.log('Looking for: ' + message)
return queryExecutor(message)
}
}
function findAllStuffs(stuffsRepository, query){
return stuffsRepository.findAllStuffs()
}
dispatcher.register({
'for': 'AllStuffs',
retrieve: inTransaction(log(function(message){
return findAllStuffs(stuffsRepository, message)
}))
})
console.log(dispatcher.dispatch('AllStuffs' , 'gattini'))
function safeQuery(queryExecutor) {
return function(message){
if (message == 'gattini'){
throw new Exception('Query not accepted')
}
else {
return queryExecutor(message)
}
}
}
dispatcher.register({
'for': 'ImprovedAllStuffs',
retrieve: safeQuery(inTransaction(log(function(message){
return findAllStuffs(stuffsRepository, message)
})))
})
try {
dispatcher.dispatch('ImprovedAllStuffs', 'gattini')
}
catch (e){
console.log('gattini banned!')
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment