4

プレゼンター クラスから新しいドメイン クラスをリファクタリングしましたが、インスタンス化する場所がわかりません。

これは、メンテナンスが不十分なレガシー プロジェクトで進行中の大規模なリファクタリング作業の一部です。

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

基本的に控えめな形式であるビューは、すべての点でプレゼンターに完全に依存しています。

これは典型的な Passive View のパターンであり、私はそれを守り続けたいと思っています。それは私のジレンマに私をもたらします。プレゼンターが使用する新しいドメイン オブジェクトのインスタンスを作成する必要があります。

  • コンストラクターを介して渡すと、ビューはそれを作成する必要があり、不要な依存関係が得られます。
  • プレゼンター内のどこかに作成すると、単体テストでモック オブジェクトに置き換えることができません。
  • プレゼンターのパブリック プロパティにすると、それが使用されるプレゼンター メソッドに作成順序の依存関係が導入されますが、どの外部クラスがそれを作成する責任を負うのかまだ解決していません。

現在、依存性注入フレームワークは使用していません。将来的に使用することに興味がありますが、サードパーティのフレームワークをミックスに導入するには、ソースコードはまだ脆弱です。

私はどんな提案にもオープンです。

4

3 に答える 3

2

私はすでにそれをやった!!! ここで私のリポジトリを見てください。ここでの私の選択は、コンストラクターを使用することです...最も貪欲なものを満足させます。プレゼンターが稼働していると確信しています。あなたの場合、依存関係のビュー固有の実装から提供できます。

楽しんで :)

于 2009-05-11T19:20:07.553 に答える
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;
}

現在、単体テストではビューと依存関係の両方にモックを渡す新しいインターフェイスを使用している間、本番コードは元のインターフェイスを引き続き使用します。依存関係の数が増え続ける場合は、リファクタリングが必要になりますが、当面はこれが理想的なソリューションです。

于 2009-05-12T17:58:06.527 に答える
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();
    }
}
于 2009-05-11T20:03:41.523 に答える