Guest User

Untitled

a guest
Nov 19th, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.55 KB | None | 0 0
  1. class Foo {
  2. constructor(dm: DependencyProvider) {}
  3. foo() { console.log('foo'); }
  4. }
  5.  
  6. class MockFoo extends Foo {
  7. foo() { console.log('mocked foo'); }
  8. }
  9.  
  10. class Bar {
  11. foo: Foo;
  12. constructor(dm: DependencyProvider) {
  13. this.foo = dm.getProviderFor(Foo)();
  14. }
  15. bar() { console.log('bar'); }
  16. }
  17.  
  18. class MockBar extends Bar {
  19. bar() { console.log('mocked bar'); }
  20. }
  21.  
  22. class DependencyProvider {
  23. private providers: Map<string, () => any> = new Map();
  24. setProviderFor<T>(ctor: { new(DependencyManager): T }, provider: () => T) {
  25. this.providers.set(ctor.name, provider);
  26. }
  27. getProviderFor<T>(ctor: { new(DependencyManager): T }): () => T {
  28. const provider = this.providers.get(ctor.name);
  29. if (!provider) {
  30. throw new Error(`No provider registered for type ${ctor.name}`);
  31. }
  32. return provider;
  33. }
  34. }
  35.  
  36. class DefaultDependencyProvider extends DependencyProvider {
  37. constructor() {
  38. super();
  39. this.setProviderFor(Foo, () => new Foo(this));
  40. this.setProviderFor(Bar, () => new Bar(this));
  41. }
  42. }
  43.  
  44. class NotRegistered {}
  45.  
  46. console.log('default injection');
  47. const d = new DefaultDependencyProvider();
  48. d.getProviderFor(Foo)().foo();
  49. d.getProviderFor(Bar)().bar();
  50. d.getProviderFor(Bar)().foo.foo();
  51.  
  52. console.log('mocked injection');
  53. d.setProviderFor(Foo, () => new MockFoo(d));
  54. d.getProviderFor(Foo)().foo();
  55. d.getProviderFor(Bar)().bar();
  56. d.getProviderFor(Bar)().foo.foo();
  57.  
  58.  
  59. console.log('invalid injection');
  60. try {
  61. d.getProviderFor(NotRegistered)();
  62. } catch (e) {
  63. console.log(e);
  64. }
Add Comment
Please, Sign In to add comment