2

我有一个名为Infrastructure的类,我认为它可以方便地从HttpClient继承。这个类暴露了get,post,put和delete的方法。注入在Aurelia中使用获取HttpClient的多个类

import {Aurelia} from "aurelia-framework"; 
import {HttpClient, json} from "aurelia-fetch-client"; 

export default class Infrastructure extends HttpClient { 
    get(url, queryString, contentType) { 
     //.. 
    } 

    post(url, data, contentType) { 
     //.. 
    } 

    put(url, data, contentType) { 
     //.. 
    } 

    delete(url, contentType) { 
     //.. 
    } 
} 

的想法是,我现在可以有注入Infrastructure服务,他们可以在基础设施

import {inject} from "aurelia-framework"; 
import Infrastructure from "./infrastructure"; 

@inject(Infrastructure) 
export class InventoryService { 
    constructor (infrastructure) { 

     infrastructure.configure(config => { 
      config 
       .useStandardConfiguration() 
       .withBaseUrl(`http://localhost:64441/inventory`); 
     }); 

     this.infrastructure = infrastructure; 
    } 
} 

我有一对夫妇使用Infrastructure这样的服务,这一切工作正常调用configure。 问题是我不需要将两个这样的服务注入到同一个类中,并且配置的baseUrl互相干扰。

在Aurelia中,默认情况下所有东西都是单身人士,我知道,但是在Aurelia中处理这种情况的首选方法是什么?

我知道我总是可以跳过配置baseUrl,但配置起来非常方便,我很好奇是否有更好的方法。

回答

4

您可以使用不同的密钥注册同一个“类”的多个实例。注册码可以是任何东西,它不需要是类/构造函数。

下面是一个例子。第一步是要改变你的Infrastructure类接受的构造函数的baseUrl参数:

export class Infrastructure { 
    constructor(baseUrl) { 
    this.configure(config => { 
     config 
     .useStandardConfiguration() 
     .withBaseUrl(baseUrl); 
     }); 
    } 
    ... 
} 

接下来你就需要使用不同的Infrastructure实例配置容器。下面的代码通常会发生在启动时,也许在main.js

// configure the container 
container.registerInstance("Inventory", new Infrastructure("http://foo.com")); 
container.registerInstance("Orders", new Infrastructure("http://bar.com")); 

现在,你就可以通过按键来解决这些实例:

// resolve by name 
var inventory = container.get("Inventory"); 
var orders = container.get("Orders"); 

或者宣布为使用@inject依赖关系:

import {inject} from "aurelia-framework"; 

@inject("Inventory", "Orders") 
export class InventoryService { 
    constructor (inventory, orders) { 
    this.inventory = inventory; 
    this.orders = orders; 
    } 
} 

有一个大概就像在这个问题上你的场景很多讨论: https://github.com/aurelia/dependency-injection/issues/73

+0

谢谢你回答@Jeremy,但不会在底层的'HttpClient'上调用'.withBaseUrl(“...”)仍然干扰这两个不同的实例,因为'Infrastructure'正在注入'HttpClient '? 另外,我是否正在通过继承'HttpClient'做一些事情? –

+1

已更新的答案 - 您可能想要停止使用扩展HttpClient并直接使用HttpClient的基础结构类。 –

+0

@Jeremy:从HttpClient派生出来有什么缺点吗?直接使用HttpClient是否会阻止OP所要求的用例,如使用抽象查询(如delete或post)来扩展它?另外:为了将来的参考,你可以在你的答案中添加用于获取aurelia-container-instance的代码,就像你在[这里]完成的一样(https://github.com/aurelia/dependency-injection/issues/73) ? – user3469861