7

私たちはHttpContextに依存するクラスを持っています。私たちはこのようにそれを実装しました :Unityでこの(HttpContext)依存関係を実装する方法は?

public SiteVariation() : this(new HttpContextWrapper(HttpContext.Current)) 
{ 
} 
public SiteVariation(HttpContextBase context) 
{} 

は、今私が何をしたいので、我々は1つのコンストラクタを作成することができ、Unity経由SiteVariationクラスをインスタンス化することです。 しかし、設定方法でこの新しいHttpContextWrapper(HttpContext.Current))をUnityに設定する方法がわかりません。

PS これは、我々は、私が直接HttpContextBaseの依存を取らないだろう

<type type="Web.SaveRequest.ISaveRequestHelper, Common" mapTo="Web.SaveRequest.SaveRequestHelper, Common" /> 

答えて

11

を使用する設定方法です。私の代わりにその周りにラッパーを作成し、必要なビットを使用します。

その後、実装
public interface IHttpContextBaseWrapper 
{ 
    HttpRequestBase Request {get;} 
    HttpResponseBase Response {get;} 
    //and anything else you need 
} 

public class HttpContextBaseWrapper : IHttpContextBaseWrapper 
{ 
    public HttpRequestBase Request {get{return HttpContext.Current.Request;}} 
    public HttpResponseBase Response {get{return HttpContext.Current.Response;}} 
    //and anything else you need 
} 

この方法では、あなたのクラスは今、単なるラッパーに依存している、としません機能するには実際のHttpContextが必要です。注入することがはるかに容易になり、テストに非常に簡単:

public SiteVariation(IHttpContextBaseWrapper context) 
{ 

} 

var container = new UnityContainer(); 
container.RegisterType<IHttpContextBaseWrapper ,HttpContextBaseWrapper>(); 
+0

ニース。今日はラップされているように見えるのでラッパーには困っていたが、このケースでは良いもののようだ。 – Michel

+1

「最近はすべてが包まれているようだ」と言う人がいると聞いています。毎年、私たちが昨年構築した虚偽のコードの周りに新しいラッパーを追加しています。これは答えとは関係ありませんが、それは良いですが、ちょうど来ました:-) – Michel

+4

@Michel:その声明には多くの真実があります。 DI/IoCが今日の味わいであることから、私はより多くのテスト可能にするために、「レガシー」コード(場合によっては2年以上経過していないコード)の周りにラッパーを記述してきました。今、それは正しいことのように感じます。 3年後、私たちは皆、「男、WTFはこれらすべてのワン・オフ・インターフェースを考えていたのです! – BFree

24

Microsoftはすでに、私は間違いなく、これらの直接ではなく、ラップを使用するので、.NETに含まれているHttpContextHttpRequestHttpResponse周りの偉大なラッパーと抽象化を構築していますそれは自分。

あなたはこのように、InjectionFactoryを使用することによりHttpContextBaseのためのUnityを設定することができます:あなたはHttpRequestBase(私がほとんどを使用する傾向がある)とHttpResponseBaseが必要な場合、あなたはこのようにそれらを登録することができ、さらに

var container = new UnityContainer(); 

container.RegisterType<HttpContextBase>(new InjectionFactory(_ => 
    new HttpContextWrapper(HttpContext.Current))); 

container.RegisterType<HttpRequestBase>(new InjectionFactory(_ => 
    new HttpRequestWrapper(HttpContext.Current.Request))); 

container.RegisterType<HttpResponseBase>(new InjectionFactory(_ => 
    new HttpResponseWrapper(HttpContext.Current.Response))); 

あなたは簡単にカスタムラッパーなしでユニットテストでHttpContextBaseHttpRequestBaseHttpResponseBaseを模擬することができます。

+2

あなたの答えはすばらしく、純粋に文法的な選択肢です。単純なオブジェクトをラムダに戻すので、正式なコードブロックは必要ありません。したがって、単純に1行書くことができます: container.RegisterType (新しいInjectionFactory(c =>新しいHttpContextWrapper(HttpContext。現在))); – BlackjacketMack

+2

@BlackjacketMackありがとう!はい、私はそれがより好きです。私はこれで答えを更新しました。規約に従うために、パラメータが使用されていないことを示すためにアンダースコアを使用するように更新しました。 –

+2

ニース。私がアンダースコア大会を見たのは初めてのことですが、私はそれが好きです!非常にコミュニケーション。 – BlackjacketMack

関連する問題