0

MVC3 アプリケーションでは、着信 Http 要求に含まれる値からドメイン オブジェクトを構築する必要があります。ロジックは非常に複雑なので、ドメイン オブジェクトを作成する責任を持つファクトリ クラスを作成しました。

私の質問は、このファクトリ クラスに Controller の Request プロパティの値を渡すか、またはファクトリ クラス内から静的な HttpContext.Request プロパティの値を参照する必要があるかということです。

私の意図は、コントローラーとファクトリ クラスの両方を単体テストすることです。そのため、どこかに HttpContext を設定するために必要なオーバーヘッドを実行する必要があります。固執する一般的なルールがあるかどうか疑問に思いましたか?

4

1 に答える 1

2

NameValueCollectionファクトリクラスにを渡すだけです。

public SomeDomainObject ConstructDomainObject(NameValueCollection data)
{
    ...
}

次に、コントローラーで次のようにします。

var domainModel = factory.ConstructDomainObject(Request.Params);

ConstructDomainObjectこれで、メソッドを好きなだけ単体テストできます。

コントローラを個別にテストする場合は、このファクトリオブジェクトにインターフェイスを実装させます。

public interface IMyFactory
{
    SomeDomainObject ConstructDomainObject(NameValueCollection data);
}

コントローラが動作するもの:

public class SomeController: Controller
{
    private readonly IMyFactory factory;  
    public SomeController(IMyFactory factory)
    {
        this.factory = factory;
    }

    public ActionResult SomeAction()
    {
        var domainModel = this.factory.ConstructDomainObject(Request.Params);
        ...
    }
}

そうは言っても、カスタムモデルバインダーを書くことを検討しましたか?ASP.NET MVCでは、モデルバインダーの責任はまさに次のとおりです。要求からモデルをインスタンス化します。このように、いくつかのホイールを再発明する必要はありませんが、この目的のためにフレームワークにネイティブに組み込まれているものを使用します。

于 2013-02-19T13:49:27.820 に答える