2

.net を使用して MVC アプリケーションを開発しています。IoC コンテナーとして autofac を使用しています。

コンストラクターにパラメーターが必要なサービス クラスがあります。また、パラメーターは実行時に入力 URL から解決されます。

public interface IService {
 ...
}

public Service : IService {

 public Service(string input) {
 }
 ...

}

public class MyController : ApiController { 
    private IService _service;

    public MyController (IService service)
    {
        _service = service;
    }
}

Service クラスの作成時にそのパラメーターを渡す最善の方法がわかりません。この問題に対処するためのベスト プラクティスは何ですか?

4

2 に答える 2

4

一般に、 とどの程度緊密に結合するかに応じて、いくつかのオプションがあります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スタブ値のテスト登録を追加することにより、ユニット テストで使用することもできます。欠点は、少し長く、必要以上に複雑に感じるかもしれないことです.

どちらでも機能しますが、それをどのように処理したいかによって異なります。

于 2013-06-10T16:23:05.337 に答える