2017-12-19 11 views
1

例として、ShipmentInformationModelFactoryがあります。目的は、モデルを作成して戻すことです。TDD - 具体的な実装には、どのようにして具体的なバージョンの工場ロジックが提供されますか?

internal class ShipmentInformationModelFactory 
{ 
    private IGetCarrierServiceFactory getCarrierServiceFactory; 

    public ShipmentInformationModelFactory(IGetCarrierServiceFactory getCarrierServiceFactory) 
    { 
     this.getCarrierServiceFactory = getCarrierServiceFactory; 
    } 


    internal ShipmentInformation Create(ICarrierTransaction carrierTransaction, CarrierPackage carrierPackage) 
    { 
     ShipmentInformation shipmentInformation = new ShipmentInformation(); 

     // Get the Carrier Service Model for the ID of the carrier service against the Package. 
     ICarrierServiceModel carrierServiceModel = this.getCarrierServiceFactory.Get(carrierPackage.CarrierServiceId); 

     shipmentInformation.ServiceCode = carrierServiceModel.Code; 

     return shipmentInformation; 
    } 
} 

次に、いくつかのスタブデータを返すだけのMockGetCarrierServiceFactoryがあります。

[TestMethod] 
    public void CreateShipmentInformation_ShipmentData() 
    { 
     ShipmentInformationModelFactory shipmentInformationModelFactory = new ShipmentInformationModelFactory(new MockGetCarrierServiceFactory()); 

     ShipmentInformation shipmentInformation = shipmentInformationModelFactory.Create(); 
    } 

    internal class MockGetCarrierServiceFactory : IGetCarrierServiceFactory 
    { 
     public ICarrierServiceModel Get(int carrierServiceModelID) 
     { 
      ICarrierServiceModel carrierServiceModel = Mock.Create<ICarrierServiceModel>(); 

      Mock.Arrange(() => carrierServiceModel.Code).Returns("TestCarrier"); 

      Mock.Arrange(() => carrierServiceModel.Description).Returns("TestDescription"); 

      return carrierServiceModel; 
     } 
    } 

これは素晴らしい作品と私​​はそれが非常によくSOLID原則に従うように、私が間違っているなら、私を修正すること自由に感じなさい感じます。

私の問題は、この実装の(ライブ)具体的なバージョンが付属しています。どの時点でGetCarrierServiceFactoryの具体的なバージョンをShipmentInformationModelFactoryに渡すべきですか?

デフォルトのコンストラクタを作成し、その内部に自動的に値を設定する必要がありますか?

ShipmentInformationModelFactoryオブジェクトをインスタンス化するクラスは、それをコンストラクタに渡して渡すことができましたが、ここでは依存関係を作成しました。

私はTDDとSOLIDの原則を80%理解しているように感じますが、これらの工場の作成に関しては迷っています。

答えて

2

ShipmentInformationModelFactoryオブジェクトをインスタンス化するクラスは、それを渡してコンストラクタに渡すことができましたが、ここでは依存関係を作成しました。

依存関係があります。 ShipmentInformationModelFactoryは、IGetCarrierServiceFactoryの具体的な実装に依存します。鍵は、それらの依存関係がカップリングになるのを避けることです。

デフォルトのコンストラクタルートを使用する場合は、依存関係をShipmentInformationModelFactoryにハードコードし、2つを強固に結合します。

解決策は、アプリケーションの起動時にその依存性を提供することです。コードの開始点から、IoCコンテナを使用してこれらの依存関係を実現するか、純粋なDIを使用します(つまり、独自のマッピングコードを記述します)。

このようにして、2つのクラスは疎結合したままであり、テスト方法は引き続き機能しますが、アプリケーション自体に実際の依存関係を結びつけることもできます。

+0

興味深いことに、以前はIoCコンテナについて聞いたことがありませんでした。この問題を解決する最も一般的な方法は、IoC経由ですか? – Eritey

関連する問題