1

ServiceStack AppHostは、サービスの構築時にサービスに注入できるタイプを登録するためのFunq.Containerを提供します。このコンテナを使用して、それが存在するタイプに適したILogを返すILogファクトリを登録できますか?

別の言い方をすれば、次のAppHostが与えられます。

public class AppHost : AppHostBase
{
    public AppHost() : base("Example Web Services", Assembly.GetExecutingAssembly())
    {
    }

    public override void Configure(Funq.Container container)
    {
        var baseLogFactory = new ServiceStack.Logging.NLogger.NLogFactory();
        LogManager.LogFactory = new ServiceStack.Logging.Elmah.ElmahLogFactory(baseLogFactory);
        // Would prefer to register a Func<Type, ILog> one time here
    }
}

そしてサービス:

public class FooService : IService<FooRequest>
{
    static ILog Log { get { return LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); } }
    // Would prefer:
    // public ILog { get; set; }

    public object Execute(FooRequest request)
    {
        Log.Info("Received request: " + request.Dump());
        return new FooResponse();
    }
}

すべてのサービスで静的ILogボイラープレートを回避するためにAppHost.Configureに追加できるものはありますか(代わりに、単純な古いILogプロパティを使用します)?

3つ目の方法として、最も簡潔に言えば、LogManagerの代わりにFunq.ContainerをILogインジェクションに使用できますか?

4

1 に答える 1

1
container.Register<ILog>(
    ctx => LogManager.LogFactory.GetLogger(typeof(IService))
);

これで、サービスは次のようになります。

public class FooService : IService<FooRequest>
{
    public ILog { get; set; }

    public object Execute(FooRequest request)
    {
        Log.Info("Received request: " + request.Dump());
        return new FooResponse();
    }
}
于 2013-01-15T22:52:23.513 に答える