3

単体テストではAssemblyInitializeClassInitializeTestInitializeなどを使用してテストを構成します。サービス、作業単位、およびリポジトリを作成するためにいくつAssemblyInitializeかのシングルトン ファクトリを初期化します (すべてユニティ/依存性注入を使用します)。私のTestInitializeでは、各テストが独立して実行できることを確認するために必要な状態をクリアします。

Stackoverflow を通じて、次の記事に出くわしまし。私が書いたいくつかのコードについての考え方が変わったと言わざるを得ませんが、私の心はまだ賑やかです。

たとえば、次のコードを見てください。

public class MyPresenter : BasePresenter<IMyView>
{
    public MyPresenter(IMyView view) 
        : base(view)
    {
    }

    public void PrepareView()
    {
        using (IMyService service = ServiceFactory.Instance.CreateService<IMyService>())
        {
            View.Data = service.GetData();
        }
    }
}

次のような aspx ページで使用されます。

Presenter = new MyPresenter(this);
if (!IsPostback)
{
    presenter.PrepareView();
}

以前の記事を念頭に置いて、この種の種類をどのように変更すればよいですか? サービス インスタンスを PrepareView メソッドに渡す必要がありますか? しかし、私の ASPX ページは、サービスや工場などについて知り、使用後にサービスを破棄する必要があります。

Singleton ファクトリはどうすればよいですか? それをクラスのプロパティにして、Unity を介して注入しますか?

4

2 に答える 2

3

この種の依存関係の解決は洗練されていないことがわかりました.Ninjectが依存関係を配線または注入する方法を見てください.

違いがわかります。Service Locator はアンチパターンです。このブログを読むと、.NET での依存性注入の本質的な目的とプラクティスもより明確になります。

于 2011-12-30T10:51:39.687 に答える
-3

次の 2 つのオプションしか表示されません。

  1. サービスの依存関係を直接注入します(ただし、ASPXレベルでサービスを解決するのは好きではないと述べました)
  2. プレゼンターの抽象化された DI コンテナーを渡し、プレゼンターで依存関係を解決します (ただし、API が明確ではないため、この方法も好きではないと述べました)。

DI コンテナー (Unity) を使用しているため、シングルトン ファクトリを削除して Unity にすべてのファクトリを登録するだけで、必要な場所にアクセスできるようになるので、各プレゼンターが必要な依存関係を認識できるように、2 番目のオプションをお勧めします。また、問題なくコードを単体テストできます (シングルトーンが少ないため)。したがって、各プレゼンターに DI コンテナーを渡し (これらすべてを ASPX ページに保持したくないことに注意してください)、2 番目のパラメーターとして渡し、特定のプレゼンターに必要なすべてのサービスを解決します。

class Presenter
{
    public Presenter(IView, IDiContainerAbstraction container)
    ...
}

Presenter = new MyPresenter(this, unityContainer); 
public void PrepareView()      
{  
    using (IMyService service = this.unityContainer.Resolve<IMyService>())
    {
        View.Data = service.GetData();  
    }
}

そう:

  • 単体テストを可能にするシングルトーンの依存関係がない
  • インターフェイスによって抽象化された DI コンテナーなので、単体テスト中にプレゼンターのモックに passign することができます
于 2011-12-30T10:47:41.480 に答える