- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我很难理解 IOC 容器在依赖注入(inject)范围内的好处。
考虑这个基本示例:
App::bind('Car', function()
{
return new Car;
});
Route::get('/', function()
{
dd(App::make('Car')); // resolve it
});
我没有看到使用 IOC 容器比在构造函数中创建新实例有什么好处。
除了测试的好处,我读到原因是松耦合。
但是,由于“汽车”绑定(bind)仅返回新车的一个实例,因此我看不出这个示例在哪种意义上会更加松散耦合。
对我来说,两者似乎在做完全相同的事情。
最佳答案
你是对的,在人为的例子中,通常很难准确地看出你得到了什么好处。考虑一个更接近真实世界的示例 Controller :
class TestController
{
public function __construct(CarRepositoryInterface $car)
{
$this->_repository = $car;
}
public function route($id)
{
return View::make('my.view')->with('car', $this->_repository->find($id));
}
}
非常简单,一个存储库被注入(inject)到 Controller 的构造函数中,然后在 route 使用它通过 id 加载特定的汽车。这里存储库的细节并不是那么重要,大概有一个服务提供商将 CarRepositoryInterface
绑定(bind)到具体的 CarRepository
实现:
class RepositoryServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind('CarRepositoryInterface', function($app) {
return new EloquentCarRepository(new Car());
});
}
}
就是这样,每次构造 Controller 时,都会创建一个 EloquentCarRepository
并将其注入(inject)到构造函数中供 Controller 使用。
但是等等,如果您想从使用 Eloquent 切换到说 Doctrine 会怎样?由于我们在这里利用依赖注入(inject),您不必更改 Controller 中的一行代码(或可能正在使用您当前实现的任何其他 Controller )。您所要做的就是定义 CarRepositoryInterface
的其他实现,例如 DoctrineCarRepository
,并在您的服务提供商中更改一行代码:
return new DoctrineCarRepository();
依赖于 CarRepositoryInterface
的所有其他内容现在神奇地有效。而这一切都要归功于国际奥委会。
您还可以向您的服务提供商添加更复杂的逻辑:
public function register()
{
$this->app->bind('CarRepositoryInterface', function($app) {
if($app->environment() == 'production') {
return new EloquentCarRepository(new Car());
} else {
return new DoctrineCarRepository(new Car());
}
});
}
此处 EloquentCarRepository
将仅在生产环境中使用,而在任何其他环境中将使用 DoctrineCarRepository
。 (这个例子只是为了展示你如何能够更好地控制在运行时构建什么类型的对象,而不是我提倡实际这样做......)
附录
正如我在评论中所述,这是一种使用类型,您在运行时之前不太确定需要什么类型的对象。还有一个用法:依赖管理。
假设您有一个对象依赖于另一个对象:
class MyObject
{
public function __construct(AnotherObject $obj)
{
$this->obj = $obj;
}
}
还假设 AnotherObject
依赖于另一个对象:
class AnotherObject
{
public function __construct(YetAnotherObject $obj)
{
$this->obj = $obj;
}
}
这可能会很快失控,最终会产生一长串需要满足的依赖关系,然后才能真正创建对象。使用 IoC,您只需从容器中取出一个实例:
$myObject = app()->make('MyObject');
只要 IoC 可以构建所有的依赖关系,你就不必做这样的事情:
$yetAnotherObj = new YetAnotherObject();
$anotherObj = new AnotherObject($yetAnotherObj);
$myObject = new MyObject($anotherObj);
关于php - Laravel4 IOC容器的好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25251823/
我开始认真考虑使用 IoC 容器会引发创建过度设计的解决方案(至少它会促使我尝试使用各种不必要的功能:)。 是时候将我的“IoC”反模式列表与社区列表同步了。 我短暂的经验告诉我们,在启动时每个应用程
我一直在阅读有关控制反转框架的内容,而我只是在玩弄这个问题:“我到底为什么需要一个框架来做到这一点?” 不要误解我的问题...该模式是我们程序员经常使用的,但是...一个功能齐全的框架可以做到这一点?
想要改进这篇文章?提供这个问题的详细答案,包括引文和解释为什么你的答案是正确的。没有足够细节的答案可能会被编辑或删除。 我正在尝试确定是否需要付出额外的努力来封装我的 IoC 容器。经验告诉我,我应该
有人建议我,在使用 IOC 容器时,我应该改变这个: class Foobar: IFoobar, IDisposable {}; 进入这个: interface IFoobar: IDisposab
《畜牧代码》播客第 68 期有人,http://herdingcode.com/herding-code-68-new-year-shenanigans/ ,表示 IOC 容器不适合使用 Python
我们正在使用 NInject 框架在我们的应用程序中实现 IoC/DI。我们有具有内部方法的内部类。要实现 IoC/DI,我们必须提取接口(interface)。但是如果我们在一个内部类中只有内部方法
Spring IOC 相关接口分析 1.BeanFactory Spring 中 Bean 的创建是典型的工厂模式,这一系列的 Bean 工厂,即 IOC 容器,为开发者管理对象之间的依赖关系提供了很
MEF is not an IoC container .不过好像是差不多 一个 IoC 容器。似乎我可以很容易地让 MEF 表现得像一个 IoC 容器(见下面的例子),而且让 MEF 成为一个完整的
只是想继续了解 IOC 的原则。 Q1:静态方法 - 具有静态辅助方法的实用程序类是否应该与 IOC 连接? 例如,如果我有一个带有许多静态方法的 HttpUtils 类,我是否应该尝试通过 IOC
众所周知,在asp.net Startup 类中有一个方法ConfigureServices,我们可以添加自定义服务。服务通过依赖注入(inject)提供。 ASP.NET Core includes
所以..我一直在深入研究 IoC 容器和服务定位器。 我认为 IoC 容器是 IoC 容器,而不是服务定位器,因为 您使用它的方式。您将服务定位器传递给需要依赖项的类,然后通过容器检索依赖项。另一方面
阅读许多有关这三个成语之间差异的帖子。但是比较困惑,然后我遇到了这篇文章: http://martinfowler.com/articles/injection.html 只是想看看我是否做对了。如果
我正在寻找用于 asp.net webapi 的 ioc 容器。我们正在寻找的几个关键功能如下 自定义生命周期 对网络请求生命周期的内置支持 在管理依赖项注册方面与 Web API 的良好集成。 最佳
我很难跟随 FP。当人们说“更惯用的风格”时,我必须明白:99% 的 Java 库不适用于 Kotlin 和 Scala 的 FP 惯用风格,对吧?好吧,我需要 Spring Boot 来快速启动 V
目录 1、Spring 1.1、简介 1.2、优点 1.3、组成 1.4、扩展 2、IO
重要提示:请注意,我并不是说单例具有私有(private)构造函数和静态实例变量(或有人建议使用静态类),而是单例在应用程序生命周期内从控制容器的反转返回相同的实例。 许多容器默认使用较短的生命周期。
Closed. This question needs to be more focused。它当前不接受答案。 想要改善这个问题吗?更新问题,使它仅关注editing this post的一个问题。
松耦合当然很棒,但我经常想知道使用 IoC 容器(例如 CaSTLe Windsor)动态连接的开销对紧耦合系统有什么影响? 我知道详细的答案将取决于 IoC 的用途,但我真的只是想了解 IoC 工作
我正在努力让 IOC 在远程处理场景中工作。我将我的应用程序服务器设置为发布通过 XML 配置的服务(SingleCall)。 众所周知,这就像这样: RemotingConfiguration.Co
我使用 IoC (DI) 方法并且通常有参数,这些参数由最低层(数据库层等)从配置设置(即连接字符串、静态值等)中读取。最好的方法是什么? 直接在这个最底层读取,即: string sendGridA
我是一名优秀的程序员,十分优秀!