2009-05-11 5 views
4

私はプレゼンタークラスから新しいドメインクラスをリファクタリングしましたが、インスタンス化する場所を特定できません。パッシブビューアーキテクチャでPresenterクラスの依存関係を作成する場所はどこですか?

これは、従来のプロジェクトでは維持されていなかったより大きな進行中のリファクタリング作業の一部です。

現在、プレゼンターはビューのOnLoadイベントによって作成されており、ビューはコンストラクターのパラメーターとして渡されます。発表者のすべてのパブリックメソッドはパラメータなしで返されます。ビューのパブリックプロパティを使用してビューと通信します。

本質的に謙虚な形であるという見解は、すべてが発表者に完全に依存します。

これは一般的なパッシブビューのパターンであり、私はそれを続けていきたいと思います。それが私のジレンマに私をもたらします。私は、プレゼンターが使う新しいドメインオブジェクトのインスタンスを作成する必要があります。

  • 私がコンストラクタに渡した場合、ビューはそれを作成して不要な依存関係を取得します。
  • プレゼンター内のどこにでも作成すれば、ユニットテストでモックオブジェクトに置き換えることはできません。
  • プレゼンターのパブリックプロパティにすると、それが使用されるプレゼンターメソッドに作成オーダーの依存関係が導入され、それを作成する外部クラスの責任を引き継いでいません。

私は現在依存性注入フレームワークを使用していません。私は興味を持っていますが、将来はソースコードを使用して、第三者フレームワークをミックスに導入するのはまだまだ脆弱です。

私は任意の提案に開放されています。

答えて

1

私ははるかに簡単な解決策を見つけました。ここに私の元のクラスの例です:

public Presenter(IView view) 
{ 
    this.View = view; 
} 

私は、コンストラクタの引数として私の新しい依存関係を渡したいが、同様に私の見解にこの依存関係を追加したくありませんでした。レスキューにつながるコンストラクタ!

public Presenter(IView view):this(view, new Dependency()){} 

public Presenter(IView view, IDependency dependency) 
{ 
    this.View = view; 
    this.Dependency = dependency; 
} 

これで、ユニットテストでは、ビューと依存関係の両方に対して新しいテストパターンが使用されますが、プロダクションコードでは引き続き元のインターフェースが使用されます。依存関係の数が増え続けると、いくつかのリファクタリングが必要になりますが、すぐにこれが理想的なソリューションになります。

2

私はすでに完了しました! my repositoryをご覧ください。私の選択はコンストラクタを使うことです...貪欲に満足してください私はプレゼンターがアップしていると確信しています。あなたのケースでは、ビューから特定のインプリメンテーションに依存関係を提供することができます。

楽しいです:)

+0

あなたのデザインは面白いです。あなたのビューは受動的なビューパターンに合っていますが、プレゼンターとコントローラーの両方でそれが見られることはありません。私が見てきた例では、プレゼンターがドメインオブジェクトやデータストアに重い持ち上げをしたり話したりしています。あなたの中には中級者のプレゼンターと仕事をしているコントローラーがいます。余分なレイヤーのメリットは何ですか? –

+0

利点は明らかです...すべての重い作業はプレゼンターが行います。コントローラの責任は、複雑なシナリオでのナビゲーションを管理することです。ここでは、ビューが他のものを知らないウィザードの例として、分離されたナビゲーションが実現されています。すべてがコントローラによって処理されます。 – ruslander

0

私は今はリポジトリまたは工場に行っています。それはすぐにテスト可能です。将来的には、実装を置き換えてDIライブラリに移動することができます。

public class DomainObjectsRepository 
{ 
    /// <summary> 
    /// can not be instantiated, use <see cref="Instance"/> instead. 
    /// </summary> 
    protected DomainObjectsRepository() 
    { 

    } 

    static DomainObjectsRepository() 
    { 
     Instance = new DomainObjectsRepository(); 
    } 

    public static DomainObjectsRepository Instance { get; set; } 


    public virtual ICustomerDao GetCustomerDao() 
    { 
     return new CustomerDao(); 
    } 
} 

public class DomainObjectsRepositoryMock : DomainObjectsRepository 
{ 
    public override ICustomerDao GetCustomerDao() 
    { 
     return new CustomerDaoMock(); 
    } 
} 
関連する問題