2017-01-26 18 views
0

私はWebアプリケーションをビルドしています。私は依存関係注入のためにAutoFacを使用しています。クエリ文字列のパラメータをAutofacのコンポーネント登録に渡すにはどうすればよいですか?

このプロジェクトでは、Entity FrameworkのDbContextの依存関係を解決する際に、カスタムパラメータを渡す必要があります。接続文字列は動的であり、このパラメータに応じて変更できるためです。

このパラメータは、(別のアプリケーションの)クエリ文字列に由来します。私は何とかそれを傍受する必要があります、インジェクターの初期化の前にこの値を取るが、インジェクターの初期化はApplication_Start()メソッドにあるので、これを行うための最良の方法はわかりません。だから、

、私は次のコードを持っている:コンテナは、それはAutoFacドクであるだけのようApplication_Start()でAutofacInitializeを呼び出して、デフォルトContainerBuilder

そしてある

//Entity Framework DbContext 
public class MyContext : DbContext 
{ 
    public MyContext(int portalCode){...} 
} 

//AutoFac registering: 
container.Register<MyContext>(c => new MyContext(how to pass the parameter here ??)).InstancePerRequest(); 

を。

どのように私はAutofacの依存関係解決者の間にそれを達成できますか?パラメータ値のための変数で

+1

は、クエリ文字列は、* *ランタイムデータです。ランタイムデータを使用してアプリケーションコンポーネントを構築すべきではありません。どうしてあなたのアプリケーションを設計するのかを説明する[この記事](https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=99)をご覧ください。 – Steven

答えて

2

かいつまんで、あなたは、単に次のように行うことがあります。プロバイダクラス

を使用して

builder.Register<MyContext>(c => 
    new MyContext(int.Parse(HttpContext.Current.Request.QueryString["PortalCode"]))) 
    .InstancePerRequest(); 

以上の詳細なソリューションを

public interface IPortalCodeProvider 
{ 
    int GetPortalCode(); 
} 

public class PortalCodeProvider : IPortalCodeProvider 
{ 
    public const string PortalCodeQueryStringKey = "PortalCode"; 
    public const int DefaultPortalCode = 123; 

    public int GetPortalCode() 
    { 
     var portalCodeString = HttpContext.Current.Request.QueryString[PortalCodeQueryStringKey]; 
     int portalCode; 
     if (int.TryParse(portalCodeString, out portalCode)) return portalCode; 
     else return DefaultPortalCode; 
    } 
} 

MyContext ctor署名はMyContext(IPortalCodeProvider portalCodeProvider)

Autofacクラス登録:あなたの特定のケースで

builder.RegisterType<PortalCodeProvider>().AsImplementedInterfaces().InstancePerRequest(); 
builder.RegisterType<MyContext>().InstancePerRequest(); 
+0

良い解決策、それは私が探していたものです。 非常に簡単でわかりやすい。 – Maturano

+0

こんにちはIvan、どこbuilder.Registerコードを配置するには? – MichaelMao

+0

@MichaelMao、それをあなたの**構成ルート**に入れなければなりません。プロジェクトで** Autofac **および** Autofac.Integration.Mvc **を参照している場合は、MVCアプリケーションの場合は** Application_Start()**です。 (Container)); 'ContainerBuilder(Container) ';' ContainerBuilder(Container)'; 'ContainerBuilder();' –

0

パス:

var parameter = "my value"; 
container.Register<MyContext>(c => new MyContext(parameter)).InstancePerRequest(); 
+0

質問を編集しました。パラメータはクエリ文字列に由来します。私は、Application_Start()メソッドでInjectorの呼び出し中にインターセプトする必要があります。 – Maturano

関連する問題