Skip to content

LeWestopher/SimpleContainer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commits
 
 
 
 
 
 
 
 

Repository files navigation

SimpleContainer

An elegant method of managing application modules via dependency injection.

Requirements

None. Pure JavaScript.

Usage

First, let's define our first dependency, a simple JSON encoder and decoder:

Contain
  .dependency('Data', function () {

    this.encode = function (data) {
      return JSON.stringify(data);
    };

    this.decode = function (data) {
      return JSON.parse(data);
    };

  });

Now, let's define another dependency that will serve as our app's data layer that utilizes the encoder and decoder module that we just created:

Contain
  .dependency('Database', function (Data) {
   
       this.save = function (user) {
         localStorage.setItem('demouser', Data.encode(user));
       };
    
       this.retrieve = function () {
         return Data.decode(localStorage.getItem('demouser'));
       };
    
     });

We can check the functionality of our application by using the build() method on the container object:

var app = Contain.build('Database');

app.save({'type': 'user', 'id': 1, 'name': 'D-Rock'});
app.retrieve(); // Returns the user we just saved!

Now let's get a little more advanced and define a full app level namespace with a User model abstraction module:

Contain

  .dependency('App', function (Users, Database) {

    this.users = Users;
    this.db = Database

  })
  
  .dependency('Users', function (Database) {

    var testing = 'alpha';

    this.findUser = function () {
      return Database.retrieve();
    };

    this.saveUser = function (user) {
      return Database.save(user);
    };

    this.setPrivate = function (value) {
      testing = value;
      return testing;
    };

    this.getPrivate = function () {
      return testing;
    };

  })

Notice on our Users model, we can define private variables and methods by choosing to not define those variables and methods onto this. These private variables and methods are simply declared in the scope of the module.

Now we can tie it all together:

var app = Contain.build('App');
app.users.findUser(); // Returns our user object we saved earlier!
app.users.getPrivate(); // Returns 'alpha'!
app.users.setPrivate('beta');
app.users.getPrivate(); // Now returns 'beta' from being set by the previous method!

Credits

Wes King - Author

Angular Devs for the annotate method;

License

Copyright 2016, Wes King

Licensed under The MIT License Redistributions of files must retain the above copyright notice.

About

A lean module for managing application dependencies via injection

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published