javascript - Angular 2+ 使用 DI 和实例化模型

标签 javascript angular

我希望能够使用构造函数实例化模型,但仍然为该模型提供注入(inject)服务。

换句话说,我希望能够做这样的事情:

var book = new Book({ id: 5 });   // creates instance, sets id = 5
book.makeHttpCall();              // makes an API call with Angular's http service

为了实现此目的,我有一个“工厂”,它使用标准依赖项注入(inject)来获取 http 服务。这个工厂有一个方法,例如make() 创建模型的实例。然后,它获取对其注入(inject)的 http 服务的引用,并将其分配给模型内的变量。

在代码中,以书籍为例:

使用此设置的服务:

@Injectable()
export class LibraryService {
    constructor(
        private http: Http,
        private bookFactory: BookFactory
    ) {}

    getBook(): Observable<BookModel> {
        return this.http.get('http://localhost:3000/book/1')
            .map((res) => {
                return this.bookFactory.make(res.json().data)
            });
    }
}

创建模型的工厂,并为它们提供http服务:

@Injectable()
export class BookFactory {
    constructor(public http: Http) {}

    make(def): BookModel {
        let book = new BookModel(def);

        book.di = {
            http: this.http
        };

        return book;
    }
}

图书模型现在可以使用 this.di.http 中的 http 服务:

export class BookModel {
    di: any;
    constructor(private def: object) {}

    makeHttpCall() {
        this.di.http.get(...)
        ...
    }
}

我所拥有的作品。但这看起来非常h​​acky。好像我正在做一些非常反对“Angular 做事方式”的事情。在 AngularJS (1.x) 中,我使用普通的 Angular 工厂完成了这一任务,一切都很好。但这似乎是我在 Angular 2 中见过的唯一方法。

问题:

  1. 这种策略是否会令人不悦?这不是“Angular 方式”吗?
  2. 有更好的方法来完成我想做的事情吗?我发现了一些东西,例如 providers.useFactoryReflectiveInjector ,但似乎都没有实现我所寻找的目标。

感谢任何帮助。

最佳答案

在我看来,你在 Angular 方面并没有做坏事,但在软件设计方面。看来你混合了责任。 Book 不应该是一个只保存书籍数据的类。执行 api 调用的类应该是某种从图书实例获取 id 或其他数据的存储库模式。另请查看 Solid 中的 s

关于javascript - Angular 2+ 使用 DI 和实例化模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43710046/

相关文章:

javascript - CoffeeScript 模块的模式

javascript - jquery-ui : Dialog not opened at vertical center

javascript - 通过 jQuery 设置显示属性 - 在 Chrome 中不起作用?

angular - 如何将异步验证器添加到自定义字段?

Angular 2 : separation all services to one module

javascript - 是否可以在休息参数上设置默认参数值

javascript - 在 Chrome 扩展程序中捕获 URL

组件中的 Angular2 : Uncaught (in promise): Quotes are not supported for evaluation!

javascript - Angular 8.2 + 火力地堡 : `ERROR in ./src/app/app.module.ngfactory.js` errors near the end of `ng build --prod` fails the process

angular - 路由中可变数量的参数