15

現在、プロジェクトからNinjectを削除し、Simple Injectorの使用に移行していますが、正しく機能しないことが1つあります。

私のロギングでは、サービスの登録で、以前はパラメータをロギングクラスにそのまま渡すことができました。

_kernel.Bind<ILogger>().To<Logger>()
    .WithConstructorArgument("name",
        x => x.Request.ParentContext.Request.Service.FullName);

SimpleInjectorでこれを再現する方法を探しています。これまでのところ、これ以外はすべて機能しています。次の手順を実行することで、正しいロガー名が表示されていなくても、ログを機能させることができます。

_container.Register<ILogger>(() => new Logger("test"));

誰かが似たようなことをした経験はありますか?

4

2 に答える 2

11

その登録は、コンテキストベースのインジェクションの形式です。これには、オーバーロードの1つを使用できますRegisterConditional

RegisterConditionalただし、ファクトリメソッドを使用して型を作成することはできません。したがってLogger、次のように、クラスの汎用バージョンを作成する必要があります。

public class Logger<T> : Logger
{
    public Logger() : base(typeof(T).FullName) { }
}

次のように登録できます。

container.RegisterConditional(
    typeof(ILogger),
    c => typeof(Logger<>).MakeGenericType(c.Consumer.ImplementationType),
    Lifestyle.Transient,
    c => true);

ただし、このStackoverflowの質問(および私の回答)を読んで、ログに記録しすぎていないかどうかを自問してください。

于 2012-12-17T16:17:32.700 に答える
5

RegisterConditionalSimple Injector 3では、メソッドを使用してコンテキストベースのインジェクションがサポートされるようになりました。たとえば、LoggerをConsumer1に、LoggerをConsumer2に注入するには、次のように実装タイプのファクトリデリゲートを受け入れるRegisterConditionalオーバーロードを使用します。

container.RegisterConditional(
    typeof(ILogger),
    c => typeof(Logger<>).MakeGenericType(c.Consumer.ImplementationType),
    Lifestyle.Transient,
    c => true);
于 2015-10-22T13:23:24.327 に答える