2016-01-14 17 views
14

Tôi có một lớp có hàm tạo có hai đối số; một là một phụ thuộc, người kia là một tài sản cấu hình:tiêm hỗ trợ ở Aurelia?

@inject(Dependency) 
class MyClass{ 
    constructor(dependency, config){ 
    } 
} 

Làm thế nào tôi có thể sử dụng dependency injection Aurelia để tự động bơm phụ thuộc nhưng cho phép người tiêu dùng của lớp để xác định giá trị cấu hình?

Trả lời

2

Cuối cùng tôi đã tạo ra một phân giải tùy chỉnh, có nghĩa là các mã đẹp và mô-đun và dễ dàng để sử dụng trong các lớp khác.

foo.js

import {inject} from 'aurelia-framework'; 
import {FooDependency} from './foo-dependency'; 

@inject(Dependency) 
export class Foo{ 
    constructor(dep, cfg){} 

    static useArgs(...args){ 
    return new Resolver(Foo, args); 
    } 
} 

@resolver 
class Resolver{ 
    constructor(Class, args){ 
    this.Class = Class; 
    this.args = args; 
    } 

    get(container){ 
    var Class = this.Class, 
     // Class.inject is the array of the class's dependencies 
     // we need to resolve them all before they're useful 
     dependencies = Class.inject.map((dep)=>container.get(dep)), 
     // Pass the resolved dependencies + any additional arguments to the new class 
     args = dependencies.concat(this.args); 

    return new Class(...args); 
    } 
} 

nhu cầu-foo.js

import {inject} from 'aurelia-framework'; 
import {Foo} from 'foo'; 

@inject(Foo.useArgs('my config')) 
export class NeedsFoo{ 
    constructor(fooConfigured){ 
    } 
} 
+2

ồ người đàn ông- Tôi nghĩ bạn cần thiết lập cấu hình động, mỗi khi một 'Foo' được khởi tạo. Nó có vẻ như cho nhu cầu của bạn, không ai trong số những gì chúng tôi đã làm là cần thiết. Tất cả bạn cần làm là đăng ký cấu hình của bạn trong container: 'container.registerInstance ('config key', myConfig);' sau đó thêm '@inject (Dependency, 'config key')' to 'Foo'. –

+0

@ JeremyDanyow Không, bạn đã đúng lần đầu tiên, thiết lập tự động mỗi lần. Cách này cho phép tôi gọi 'Foo.useArgs()' với một giá trị khác nhau mỗi khi tôi muốn sử dụng Foo, bởi vì nó trả về một thể hiện mới của 'Resolver' mỗi lần. – NeonPaul

16

Dưới đây là một số tùy chọn:


Lựa chọn 0: Nhà máy Resolver

foo.js

import {inject} from 'aurelia-framework'; 
import {FooDependency} from './foo-dependency'; 

@inject(FooDependency) 
export class Foo { 
    constructor(dep, config) { 
    } 
} 

nhu cầu-foo.js

import {inject, Factory} from 'aurelia-framework'; 
import {Foo} from './foo'; 

@inject(Factory.of(Foo)) 
export class NeedsFoo { 
    constructor(fooFactory) { 
    let config = {}; 
    this.foo = fooFactory(config); 
    } 
} 

Lựa chọn 1: Nhà máy

foo.js

import {inject} from 'aurelia-framework'; 
import {FooDependency} from './foo-dependency'; 

class Foo { 
    constructor(dep, config) { 
    } 
} 

@inject(FooDependency) 
export class FooFactory { 
    constructor(dep) { 
    this.dep = dep; 
    } 

    makeFoo(config) { 
    return new Foo(this.dep, config); 
    } 
} 

nhu cầu-foo.js

import {inject} from 'aurelia-framework'; 
import {FooFactory} from './foo'; 

@inject(FooFactory) 
export class NeedsFoo { 
    constructor(fooFactory) { 
    let config = {}; 
    this.foo = fooFactory.makeFoo(config); 
    } 
} 

Phương án 2: Child container

foo.js

import {inject} from 'aurelia-framework'; 
import {FooDependency} from './foo-dependency'; 

export const configKey = 'config'; 

@inject(FooDependency, configKey) 
export class Foo { 
    constructor(dep, config) { 
    } 
} 

nhu cầu-foo.js

import {inject, Container} from 'aurelia-framework'; 
import {Foo, configKey} from './foo'; 

@inject(Container) 
export class NeedsFoo { 
    constructor(container) { 
    let config = {}; 
    let childContainer = container.createChild(); 
    childContainer.registerInstance(configKey, config); 
    this.foo = childContainer.get(Foo); 
    } 
} 

Lựa chọn 3: Brute Force

foo.js

export class Foo { 
    constructor(dep, config) { 
    } 
} 

nhu cầu-foo.js

import {inject, Container} from 'aurelia-framework'; 
import {FooDependency} from './foo-dependency'; 
import {Foo} from './foo'; 

@inject(Container) 
export class NeedsFoo { 
    constructor(container) { 
    let config = {}; 
    let dep = container.get(FooDependency); 
    this.foo = new Foo(dep, config); 
    } 
} 
+2

ah, rất tốt đẹp, nên được đặt ở đâu đó trong tài liệu aurelia – valichek

+0

Vì vậy, với phương án 1, làm thế nào tôi đơn vị kiểm tra lớp NeedsFoo? – Geerten

+1

Tôi có nghĩa là tùy chọn 0. – Geerten