2016-05-13 8 views
1

私はAutofacを使用しようとしましたIRegistrationSource他のインタフェースを解決しましたが、動作しません。私のコードは以下の通りです:Autofac、MakeGenericMethod.Invoke not working

public class SettingsSource : IRegistrationSource 
{ 
    static readonly MethodInfo BuildMethod = typeof(SettingsSource).GetMethod(
     "BuildRegistration", 
     BindingFlags.Static | BindingFlags.NonPublic); 

    public IEnumerable<IComponentRegistration> RegistrationsFor(
      Service service, 
      Func<Service, IEnumerable<IComponentRegistration>> registrations) 
    { 
     var ts = service as TypedService; 
     if (ts != null && typeof(ISettings).IsAssignableFrom(ts.ServiceType)) 
     { 
      var buildMethod = BuildMethod.MakeGenericMethod(ts.ServiceType); 
      yield return (IComponentRegistration)buildMethod.Invoke(null, null); 
     } 
    } 

    static IComponentRegistration BuildRegistration<TSettings>() 
     where TSettings : ISettings, new() 
    { 
     return RegistrationBuilder 
      .ForDelegate((c, p) => 
      { 
       return c.Resolve<ISettingService>().LoadSetting<TSettings>(); 
      }) 
      .InstancePerLifetimeScope() 
      .CreateRegistration(); 
    } 

    public bool IsAdapterForIndividualComponents { get { return false; } } 
} 

プライベートメソッドc.Resolve()。LoadSetting()は起動できません。

迷惑リンクを確認しても、その理由を理解できません。 Autofac. How to use custom method(property) to resolve some interface?

http://nblumhardt.com/2010/01/declarative-context-adapters-autofac2/

誰もが手掛かりを与えることができますか?

ありがとうございました

+0

あなたが提供するコードは、nopcommerceの設定プロバイダの登録の逐語的なコピーです。したがって、意図したとおりに動作することを確認することができます。そうしないと、設定をまったく使用できなくなります。あなたは何をしようとしているのですか? –

+0

ありがとうMarco、はい、それはnopcommerceからです。 nopcommerceのようなシステム設定フレームワークを実装したい。すべての設定はISettingServiceによって操作され、システムの起動時に登録されます。しかし、私はforlegateの私的な機能が解雇されていないことが分かった。 – LLI

+0

登録ソースを登録しましたか?最初に、RegistrationsForメソッドをデバッグして、ISettingsを継承するクラスを解決するときに、それが呼び出されていることを確認し、yield return句を実行する必要があります。ブレークポイントを設定する必要があります。 –

答えて

0

提供されたコードは、nopCommerceから完全に動作します。私はそれも自分自身を使用し、素晴らしい作品です。したがって、それが機能していない場合、問題は表示されないコードのどこかにありますが、すでに動作している可能性があります。

あなたのコメントによれば、BuildRegistrationメソッドに達すると仮定すると、サービスインスタンス自体ではなく、依存関係ルールのみが返されます。 c.Resolve<ISettingService>()コールは、必要に応じて遅れて、遅延して実行されます。ラムダ内にブレークポイントを設定して、それが起こっていることを確認する必要があります。

BuildRegistrationは、ISettingsを実装するクラスごとに1回だけ呼び出されることに注意してください。その後、Autofacは提供されたルールを使用します。

+0

これについて私の前の回答を確認することができます:http://stackoverflow.com/questions/32944127/how-to-load-records-from-setting-table-of-nopcommerce-v3-5/32987318#32987318 –

+0

ありがとう私がBuildRegistrationに到達できたとMarcoが言いましたが、ラムダの中にブレークポイントを設定しようとしましたが、何も起こらず、まったくトリガーしなかったので、LoadSetting ()に達しません。 – LLI

+0

@LLIのように、既に提供しているコードが正しいので、残りのコード(autofac登録、設定クラスと使用法)を提供する必要があります。 –