2016-10-11 9 views
1

私はTDDをかなり新しくしており、私は現在のプロジェクトをTDDで書いています。できるだけTDDでカバーしようとしていますが、それまではうまくいっています。TDDからの建築アーキテクチャ "modules"

私のプロジェクトの各「モジュール」は自己完結型です。それらはすべて、プロジェクトの他の部分からの依存関係に依存することなくテストすることができ、私は "モック"依存関係を注入することができます。

CoreDatamanagedObjectContextは、プロジェクト内のアイテムを保存および検索するために使用されます。

だから、私はすべてをまとめて、すべてを構築するのが最善であると思っています。

たとえば、私はビューコントローラを持っている可能性がありますCore Dataに何かを保存するサービスを持っているので、このサービス "モジュール"はmanagedObjectContextが必要です。

どうすればいいですか?

本当にそれを必要としない一連のオブジェクトを通して管理オブジェクトコンテキストを渡す必要がありますか?それは私が働いているすべてのものを壊すように思える?

私はシングルトンを使うことができましたが、以前の経験から痛みの原因になるので避けたいと思っています。

どうすればよいですか?

+2

Javaのパースペクティブから来ています。私は言うことができます:Javaのために、他の**依存性注入**のフレームワークを探しているでしょう。テストに必要な注入はしません。実際の実行時に - そのようなCoreDataオブジェクトをどのようにインスタンス化するかを知っている例を理解しているシステム。そのようなオブジェクトを必要とする「クライアントコード」を利用できるようにします。それから、**あなたのすべてのモジュールを作成した後**あなたはそのような質問を考え始めるのがちょっと奇妙に聞こえます。もちろん、TDDはもっとボトムアップです。すべてのモジュールをやる前に、あるレベルの "トップダウン"デザインを行ってはいけませんか? – GhostCat

+0

@GhostCat okだから、コアデータのマネージドオブジェクトコンテキストを渡す代わりに、「モジュール」にインスタンス化する方法がわかっているはずです。問題は、管理されたオブジェクトのコンテキストをアプリ全体で使用する必要があるということです。それらのうちの1つだけ...私はマネージドオブジェクトのコンテキストにシングルトンを使用し、シングルトンインスタンスを取得する必要があることを再考します。うーん... – Fogmeister

+0

@GhostCat RE最後の質問です。私はまだすべてのモジュールをやっていない。私は今、トップダウン設計について考えていますが、それを必要とするモジュールのTDDには深く入り込む前に考えています。私はあまりにも遠くに行きたくないと思っています。 :) – Fogmeister

答えて

1

また、TDDアプローチを使用してプロジェクトを作成しています。ここではいくつかの詳細は以下のとおりです。私たちは、各モジュールは、VIPERモジュールであるVIPER architecture.

  • を使用している

    • viperモジュールの初期化と依存関係の追加のための依存性注入(Swinject)。
    • アプリケーションイベントをモジュール単位で処理するデーモン。
    • 共通サービス層は、サーバーとローカルストレージとの通信を担当します。

  • は、我々は内部でブートストラップおよびルーティングのための Cobra framework(使用swinject)、デーモンの Medusaを開発しました。私たちはこれらのプロジェクトをオープンソース化しましたが、依然としていくつかのドキュメントが必要です。

    ここでは、アプリケーションのアーキテクチャ図を示します。

    enter image description here

    あなたのユースケースに答えるために:

    のViewControllerは、サービスのインスタンスを持つべきではありません。サービスレイヤーと を対話するには、インタラクタを使用する必要があります。 あなたがcobramedusaを使用している場合、あなたはこのような何かあなたのアセンブリを定義することができます。今、あなたが作成し、「ストア(他のオブジェクト)の通過を心配する必要はありません、DIの電源を参照してください

    // store assembly 
    
    container.register(StoreManager.self) { resolver in 
        return StoreManager(...) 
    }.inObjectScope(.Container) // for singleton 
    
    
    // service assembly 
    
    container.register(LoginServiceType.self) { resolver in 
        return LoginService(store: resolver.resolve(StoreManager.self)!) 
    } 
    
    container.register(UserServiceType.self) { resolver in 
        return USerService(store: resolver.resolve(StoreManager.self)!) 
    } 
    
    
    // Login Service 
    
    class LoginService { 
        let store: StoreManager 
        init(store: StoreManager) { 
         self.store = store 
        } 
    
        func login() { 
        store....() 
        } 
    } 
    
    
    // User service 
    
    class UserService { 
        let store: StoreManager 
        init(store: StoreManager) { 
         self.store = store 
        } 
    
        func fetchUserDetails(id: String) { 
         store....() 
        } 
    } 
    

    インスタンス "。基本的には、アセンブリをセットアップする必要があり、すべて設定されています。

    +0

    優れています。どうもありがとう。私は彼のパターンをさらに調査します。とにかく私がTDDの必要性として開発し始めた構造のようなものです。 DIなしでは、個々のユニットをテストすることはかなり不可能です。 – Fogmeister

    関連する問題