适用于AngualrDart和Flutter的AppController

时间:2018-04-26 06:18:43

标签: angular dependency-injection dart flutter angular-dart

我正在R7.plot(T)AngularDart编写一个共享公共代码的项目。我有flutter,它将处理大多数组件中使用的所有逻辑业务代码:

AppController

现在我在写class AppController { AppController(this.serviceOne, this.serviceTwo...); } 。我有两个选择:

  1. 使用DI,将AppController,serviceOne,serviceTwo作为提供者传递给bootstrap。我不确定我是否应该将这些类标记为可注射。我听说颤动并不能完全支持注射剂。我是Dependency注入的新手,不知道如何实现它。
  2. 代码1.1:

    AngularDart

    代码1.2:

      bootstrap(AppComponent, [
        new Provider(
          AppController,
          useValue: new AppController(
            new ServiceA(),
            new ServiceB(),
            ....
          ),
        ),
      ]);
    

    代码1.3:

      bootstrap(AppComponent, [
        AppController,
        ServiceA,
        ServiceB,
      ]);
    
    1. 逐层传递到AppComponent和子组件 // From Günter Zöchbauer's answer createAppFactory(ServiceA sa, ServiceB sb) => new AppController(sa, sb); bootstrap(AppComponent, [ new Provider<AppController>( useFactory: createAppFactory, deps: [ServiceA, ServiceB] ), ]); 。这很简单,但看起来并不优雅。
    2. @input
      1. 其他更好的选择?
      2. 我也在想,如果我们使用appController来处理业务逻辑层,并让平台代码只实现小部件。服务在公共代码中定义。我可以在appController中创建服务,不要让平台代码触摸它。换句话说,平台代码仅通过appController使用公共代码,服务在appController内部创建。

1 个答案:

答案 0 :(得分:0)

如果添加@Injectable()注释,则不能再使用Flutter中的代码,因为它通过Angular将代码绑定到dart:html

您需要在不使用@Injectable()的情况下创建服务,然后使用注释为Angular添加包装。

shared_code/lib/foo_service.dart

中的

class FooService {
  BarService bar; 
  FooService(this.bar);
}
angular_code/lib/foo_service.dart

中的

import 'package:shared_code/foo_service.dart' as shared;

@Injectable()
class FooService extends shared.FooService {
  FooService(BarService bar) : super(bar);
} 

我想我看到它提到Angular团队正在讨论他们是否可以摆脱@Injectable()。这会使这更容易。

另一种方法是使用工厂提供商不需要@Injectable()

FooService createFooService(BarService bar) => new FooService(bar);
FooService createBarService() => new BarService();

providers: const [
  const FactoryProvider(FooService, createFooService, deps: const [BarService]), 
  const FactoryProvider(BarService, createBarService)]