一般に、 とどの程度緊密に結合するかに応じて、いくつかのオプションがありますHttpContext
。
最初のオプションは、 lambda を使用して登録することです:
builder.Register(c => new Service(HttpContext.Current.Request.RawUrl)).As<IService>();
これの利点は、シンプルで読みやすいことです。欠点は、Service クラスをリファクタリングするときに、コンストラクターのパラメーターをさらに追加する可能性があるため、登録もリファクタリングする必要があることです。と密結合してHttpContext
いるため、単体テストでこの登録を使用すると問題が発生します。
2 番目のオプションは、パラメーターを使用して登録できることです。もAutofacWebTypesModule
登録しておく必要があります。
// Automatically provides HttpRequestBase registration.
builder.RegisterModule<AutofacWebTypesModule>();
// Register the component using a parameter.
builder.RegisterType<Service>()
.As<IService>()
.WithParameter(
// The first lambda determines which constructor parameter
// will have the value provided.
(p, c) => p.ParameterType == typeof(string),
// The second lambda actually gets the value.
(p, c) => {
var request = c.Resolve<HttpRequestBase>();
return request.RawUrl;
});
これの利点は、オブジェクトの実際の構築を環境値の取得から切り離すことです。HttpRequestBase
スタブ値のテスト登録を追加することにより、ユニット テストで使用することもできます。欠点は、少し長く、必要以上に複雑に感じるかもしれないことです.
どちらでも機能しますが、それをどのように処理したいかによって異なります。