2

私は主にNinjectを使用していますので、用語を混ぜてお詫び申し上げます。オートモジュールモジュール登録

宛先クラス名をロガー名として使用してNLogを処理するロガーモジュールを作成しました。これは非常によく似ています:http://docs.autofac.org/en/latest/examples/log4net.html?highlight=log4net

サービスレベルの登録をすべて担当するサービスレイヤーで作成されたモジュールもあります。ここで

public class ServiceModule : Module 
{ 
    protected override void Load(ContainerBuilder builder) 
    { 
     builder.Register(x => new AccountService(x.Resolve<ILogger>())) 
      .As<IAccountService>() 
      .InstancePerRequest(); 
    } 
} 

は私autofac登録です:実行時に

var builder = new ContainerBuilder(); 

builder.RegisterControllers(Assembly.GetExecutingAssembly()); 
builder.RegisterModule(new LoggingModule()); 
builder.RegisterModule(new ServiceModule()); 

var container = builder.Build(); 
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

app.UseAutofacMiddleware(container); 
app.UseAutofacMvc(); 

、私はILoggerですが、登録されていないと言った例外を取得し、私が引き起こしているかのモジュールが仕事について何かをしないのです。このように見えますILoggerは私のサービスモジュールでは見えませんか?

答えて

2

モジュールは多くのことを行うことができます:新しいコンポーネントを登録したり、Autofacイベントを購読することができます。

この場合、LoggingModuleILogを登録しません。 Preparingイベントを使用して他のコンポーネントの準備をインターセプトし、必要に応じてILogを作成する新しいParameterを追加します。

あなたはILogを解決することはできませんが、あなたのAccountService実装がILogが必要な場合は、次のParameterがトリガされますとILog実装を提供します。私は登録を入力するために私の登録を変更してみました、それが働いていたので、理にかなって

builder.RegisterType<AccountService>() 
     .As<IAccountService>() 
     .InstancePerRequest(); 
+0

OK:

new ResolvedParameter( (p, i) => p.ParameterType == typeof(ILog), (p, i) => LogManager.GetLogger(p.Member.DeclaringType) ) 

あなたがしなければならないのは、明示的にインスタンスを作成しようとせずに、あなたのタイプを登録することです。どのようにモジュールを解決ステートメントで動作させることになるでしょうか。 – Dan

+0

'IRegistrationSource'を見てください:http://docs.autofac.org/en/latest/advanced/registration-sources.html –

+0

ありがとう、それはうまくいくはずです – Dan