xen*_*ide 1 typescript aurelia
在使用Spring的Java中,如果我想要一个实例知道可以处理它的东西,我会写这样的东西
interface Executable<T extends Executor> {
Class<T> executorClass();
}
Executable instance = () -> MyExecutor.class;
Class<T> execClazz = instance.executorClass();
T executor = context.getBean( execClazz );
Results r = executor.execute( instance );
Run Code Online (Sandbox Code Playgroud)
我可以将此模式与Aurelia和Typescript一起使用吗?如果是这样,我如何executorClass在Typescript中定义返回类型(我不知道它们用于什么Class或如何简单地返回它).我如何从Aurelia的容器中获得类型?
您可以使用以下get方法从容器中请求类型的实例:
class Foo {
}
let foo = container.get(Foo); // returns an instance of Foo.
Run Code Online (Sandbox Code Playgroud)
在TypeScript中,您可能希望转换get方法的结果:
class Foo {
}
let foo = <Foo>container.get(Foo); // returns an instance of Foo.
Run Code Online (Sandbox Code Playgroud)
如果您有多个实现特定接口的类型,请在app startup注册相应的实现:
// interface
class FooService {
getFoos(): Promise<Foo[]> {
throw new Error('not implemented');
}
}
class HttpFooService {
getFoos(): Promise<Foo[]> {
return fetch('https://api.evilcorp.com/foos')
.then(response => response.json());
}
}
class MockFooService {
getFoos(): Promise<Foo[]> {
return Promise.resolve([new Foo()]);
}
}
// app startup... configure the container...
if (TEST) {
container.registerHandler(FooService, c => c.get(MockFooService));
// or: container.registerInstance(FooService, new MockFooService());
} else {
container.registerHandler(FooService, c => c.get(HttpFooService));
// or: container.registerInstance(FooService, new HttpFooService());
}
// now when you @inject(Foo) or container.get(Foo) you'll get an instance of MockFooService or HttpFooService, depending on what you registered.
let foo = container.get(Foo); // returns an instance of MockFooService/HttpFooService.
Run Code Online (Sandbox Code Playgroud)
我不确定这是否完全回答了你的问题.我从来没有使用过Spring,也没有做过任何Java编程.我没有完全遵循你的问题中的代码.这是一个可能有用的几个容器/ DI用例的链接.这是另一个可能有用的stackoverflow答案.以下是Aurelia DI 文档.
作为旁注,尽可能远离container.get.使用它违反了依赖性倒置原则.最好列出您的依赖项而不是主动检索它们:
好(ES6):
@inject(Foo, Bar)
class Baz {
constructor(foo, bar) {
}
}
Run Code Online (Sandbox Code Playgroud)
好(TypeScript):
@autoinject
class Baz {
constructor(foo: Foo, bar: Bar) {
}
}
Run Code Online (Sandbox Code Playgroud)
不太好:
class Baz {
constructor() {
let foo = container.get(Foo);
let bar = container.get(Bar);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
166 次 |
| 最近记录: |