通过依赖注入使用多个接口实现的最佳方式


Best way to use multiple implementations of interface with Dependeny Injection

我看到过一些类似的问题,但我还没有找到一个很好的解决方案,从接口一直到控制器。

我的问题:

我有一些需要重新启动的不同类型的应用程序,每个应用程序都有自己的重新启动应用程序的逻辑(SSH,API调用等)。我设置了一个接口,因为虽然逻辑不同,但它们都需要一些相似的功能。我还创建了3个类,每个类用于实现该接口的应用程序。我遇到的问题是理解保持逻辑尽可能从控制器抽象的最佳方法。

一些问题:

我还应该创建一个抽象类吗?这应该是一个处理所有类型并选择正确类型的控制器吗?我是否只需将不同的类注入到控制器中?

代码:

RestartInterface.php

<?php  namespace Application'Service'Restart;
   interface RestartInterface {
       public function start();
       public function stop();
       public function restart();
   }

实现类的示例:

<?php namespace Application'Service'Restart'AppOne;
   use Application'Service'Restart'RestartInterface;
    class AppOneRestart implements RestartInterface {
       public function start() {
       }
       public function stop() {
       }
       public function restart() {
       } 
   }

我怎样才能使用一个服务提供者来使它尽可能的模块化?在这种情况下的最佳实践是什么?我希望能够使用许多或尽可能少的重启实现,因为我想要。

谢谢!

抽象类是一种创建基类的方法,您不需要开发人员直接实例化,因为通常仍然缺少其中的代码,例如,方法没有完全实现。因此,您创建了一个抽象,它实现了具体重启类的常用方法

abstract class Restart {
   public function restart() {
   } 
}

然后你一个接一个地实现这些类扩展你的抽象和创建缺失的方法:

class AppOneRestart extends Restart implements RestartInterface {
   public function start() {
   }
   public function stop() {
   }
}

选项1

如果您的整个应用程序可以使用它的单个实现,并且您只需要能够从一个实现切换到另一个实现,因为您的业务发生了某种变化,那么简单的绑定就可以做到这一点:

App::bind('RestartInterface', 'AppOneRestart');

选项2

如果在请求期间可能需要其中一个或另一个,则可能需要实现工厂模式:http://en.wikipedia.org/wiki/Factory_method_pattern,因此将工厂注入到控制器中:

class RestartApiController extends Controller {
    public function __construct(RestartFactory $factory)
    {
        $this->restart = $factory->make('api');
    }
}