2017-06-23 14 views
0

私はAutofacの例とドキュメントを調べていますが、これを得るにはわかりません。Autofacによるプロパティ注入が機能していません

我々はこのように設定するプロパティを持つヘルパークラス、Core.Helpers.Tokensを持っている:

namespace Core.Helpers 
{ 
    public static class Tokens 
    { 
     private static IConfigurationManager ConfigurationManager; 

     public static string GetToken() 
     { 
      var sessionTokenName = ConfigurationManager.GetAppSetting("SessionTokenName"); 
      return (string) HttpContext.Current.Session[sessionTokenName]; 
     } 
    } 
} 

設定は次のように設計されています。私たちのMVCのWebアプリ(これは参照および使用において

namespace Core.Config 
{ 
    public interface IConfigurationManager 
    { 
     //... 
    } 

    public class WebConfigConfigurationManager : IConfigurationManager 
    { 
     //... 
    } 
} 

Core.HelpersStartup.cs私は、プロパティ注射用IConfigurationManagerを登録しようとしている。

public partial class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     var builder = new ContainerBuilder(); 

     // REGISTER CONTROLLERS SO DEPENDENCIES ARE CONSTRUCTOR INJECTED 
     builder.RegisterControllers(typeof(MvcApplication).Assembly); 
     builder.RegisterModule<AutofacWebTypesModule>(); 
     builder.RegisterFilterProvider(); 
     builder.RegisterType<WebConfigConfigurationManager>().As<IConfigurationManager>().PropertiesAutowired(); 

     RegisterTypes(builder); 

     // BUILD THE CONTAINER 
     var container = builder.Build(); 
     var webConfig = container.Resolve<IConfigurationManager>(); 

     // REPLACE THE MVC DEPENDENCY RESOLVER WITH AUTOFAC 
     DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

     // REGISTER WITH OWIN 
     app.UseAutofacMiddleware(container); 
     app.UseAutofacMvc(); 
    } 

WebコードがGetTokenを呼び出すと、ConfigurationManagerはnullです。私は何が欠けていますか?

答えて

1

Tokens.ConfigurationManagerはプライベートフィールドですが、プロパティインジェクションはパブリックプロパティで動作します。

また、スタティックではなくインスタンスプロパティである必要があります。だから、最後にそれが

public IConfigurationManager ConfigurationManager{get;set;} 

する必要がありますしかし、それはそこに、あなたがトークンのインスタンスを注入することもあるだろうし、それはもはや静的ヘルパークラスになるだろう、あなたには、いくつかの再設計を行う必要がないだろう意味しますいくつかのオプションがあります:

  1. あなたは(あなたがGetTokens()
  2. あなたは依存関係には、この静的ヘルパーを促進するための入力パラメータとしてそれを渡すことができますからGetTokensを呼び出すことを期待どこでもIConfigurationManagerインスタンスを持っている場合例えばITokenService ?)それは必要なすべての場所に注入されます。静的にする代わりに、 あなたはそれをシングルトンにするために、Autofac生涯管理を使うことができます。 (おそらく最高の解決策)
  3. 最悪解決策ですが、これが静的ヘルパークラスであることをあきらめずに動作する最小の変更は、プロパティに注射の代わりにDependencyResolverを使用することです:

    プライベート静的IConfigurationManagerのConfigurationManager {取得{戻りますDependencyResolver.Current.GetService();}}

+0

さて、私は公開する必要があることがわかります。しかし、インスタンスメンバーを静的クラスで宣言することはできません。 –

+0

第3位はなぜ最悪ですか? –

+0

第3の解決策は、基本的にDIを諦め、Service Locatorを使用することにダウングレードします。これには多くの欠点があります。 https://stackoverflow.com/questions/1557781/whats-the-difference-between-the-dependency-injection-and-service-locator-patte – Loonquawl

0

あなたはIConfigurationManagerを解決している、あなたはWebConfigConfigurationManagerを解決する必要があります。

IConfigurationmanagerを使用する5つのクラスがある場合、インターフェイスを解決しても、このインターフェイスを持つどの具体的なクラスを使用したいかはわかりません。

+0

「var webConfig = container.Resolve 」を解決しようとすると、 (); '私は得る:タイプ 'Autofac.Coreの例外。Registration.ComponentNotRegisteredException 'がAutofac.dllで発生しましたが、ユーザーコードで処理されませんでした 追加情報:要求されたサービス' Clark.Chains.Core.Config.WebConfigConfigurationManager 'が登録されていません。 –

関連する問題