我对Laravel的IOC绑定有疑问,特别是ServiceProviders,他们注册了Facade访问者。
遵循IOC
的官方文档class FooServiceProvider extends ServiceProvider {
public function register()
{
$this->app->bind('foo', function()
{
return new \MyApp\Foo;
});
}
}
以后你可以有一个Facade,它只会返回" foo" as" FacadeAccessor"。
像这样重写这段代码会不会更容易?
class FooServiceProvider extends ServiceProvider {
public function register()
{
$this->app->bind('foo', '\MyApp\Foo');
}
}
它提供了几乎相同的结果,因为字符串将自动包装到Closure中并通过App :: make()进行解析。更重要的是 - 如果需要,Foo构造函数可以有依赖注入(虽然你必须在第一种情况下传递精确的对象,并且根据我的理解,松散的自动解析)。
第二个选项看起来更清晰,除非在对象初始化之前需要一些额外的逻辑 - 比如传递数据,初始化其他服务/对象等 - 对我来说看起来更好。
可能存在与此相关的性能问题?或者我错过了其他什么?
有趣的事实 - 在文档中,对于Interfaces,Laravel建议使用第二个选项而不是Closure,但是对于ServiceProviders - 直接对象初始化。
答案 0 :(得分:0)
第二种选择是最好的,闭包很大程度上用来提供一个很好的快速做事方式。
我个人避免闭包,除了路由,因为我希望IoC容器可以选择在需要时运行各种不同的依赖注入。