Skip to content

Commit

Permalink
added target component to adaptor
Browse files Browse the repository at this point in the history
  • Loading branch information
bschaepper committed Nov 14, 2015
1 parent 9711dcf commit 7e61cda
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 12 deletions.
4 changes: 2 additions & 2 deletions Container.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,8 @@ Container.prototype = {
return cache;
},

get: function (name) {
return this.resolver.get(name);
get: function (name, target) {
return this.resolver.get(name, target);
},

lookup: function (name) {
Expand Down
15 changes: 11 additions & 4 deletions DependencyResolvingAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,22 @@ DependencyResolvingAdapter.prototype = {
},

resolveDependencies: function (container) {
var dependencies = this.dependencyNames.map(container.get, container);
dependencies.forEach(this.checkDependency.bind(this, this.dependencyNames, this.name));
var dependencies = this.lookupDependencies(container);
dependencies.forEach(this.checkDependency, this);

return dependencies;
},

checkDependency: function (dependencyNames, name, dependency, index) {
lookupDependencies: function (container) {
return this.dependencyNames.map(function (dependency) {
return container.get(dependency, this.name);
}, this);
},

checkDependency: function (dependency, index) {
if (!dependency) {
throw new Error("Could not satisfy dependency '" + dependencyNames[index] + "' required by '" + name + "'");
var dependencyName = this.dependencyNames[index];
throw new Error("Could not satisfy dependency '" + dependencyName + "' required by '" + this.name + "'");
}
}

Expand Down
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,18 @@ var foo = container.get("foo");
assert(foo instanceof Foo);
````

Additionally an adaptor will get passed the name of its target component:

```javascript
var container = yaioc.container();
container.register(function NeedsFoo(foo) {});
container.registerAdaptor("foo", function (container, target) {
assert(target === "NeedsFoo");
});
var foo = container.get("foo");
````

### Caching

If you want to have a single instance of a component, use caching:
Expand Down
12 changes: 6 additions & 6 deletions Resolver.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ function Resolver(container, wrappedResolvers) {

Resolver.prototype = {

get: function (name) {
return this.resolve(name) || this.resolveInWrappedResolver(name);
get: function (name, target) {
return this.resolve(name, target) || this.resolveInWrappedResolver(name, target);
},

resolve: function (name) {
resolve: function (name, target) {
var adaptor = this.container.lookup(name);

if (!adaptor) {
Expand All @@ -21,19 +21,19 @@ Resolver.prototype = {
}

if (adaptor) {
return adaptor.getComponentInstance(this.container);
return adaptor.getComponentInstance(this.container, target);
}
},

toPascalCase: function (name) {
return name[0].toUpperCase() + name.substring(1);
},

resolveInWrappedResolver: function (name) {
resolveInWrappedResolver: function (name, target) {
var found;

this.wrappedResolvers.some(function (resolver) {
found = resolver.get(name);
found = resolver.get(name, target);
return found;
});

Expand Down
28 changes: 28 additions & 0 deletions test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,34 @@ describe("yaioc test", function () {
expect(actualContainer).to.be.eql(container);
});

it("should call adaptor with insertion point name", function () {
var actualInto;
function IntoThing (adaptorThing) {
console.log(adaptorThing);
}
container.register(IntoThing);
container.registerAdaptor("adaptorThing", function (container, into) {
actualInto = into;
return {};
});

container.get("intoThing");

expect(actualInto).to.be.eql(IntoThing.name);
});

it("should call adaptor with insertion point name undefined for top level get", function () {
var actualInto;
container.registerAdaptor("adaptorThing", function (container, into) {
actualInto = into;
return {};
});

container.get("adaptorThing");

expect(actualInto).to.be.eql(void 0);
});

});

describe("ease of use", function () {
Expand Down

0 comments on commit 7e61cda

Please sign in to comment.