2013-01-15 15 views
1

ServiceStack AppHost提供了一个Funq.Container,可用于注册可在服务构建时注入到服务中的类型。这个容器是否可以用来注册一个ILog工厂,该工厂返回一个适合其驻留类型的ILog?我该如何使用ServiceStack和Funq.Container解决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(); 
    } 
} 

请问有什么可以添加到AppHost.Configure以避免所有静电的ILog样板我的服务(而只是使用普通的旧ILog属性)?

第三种方式,最简洁,我可以使用Funq.Container进行ILog注入而不是LogManager吗?现在

+0

IIRC,Funq不能很好地适用于自动化财产注射。我想你可以实现任何类型的'InitializedBy'部分并让它分配合适的记录器。所以'container.Register >(()=> new FooService())。InitializedBy((c,foo)=> foo.Log = c.Resolve (typeof(FooService))''但是你可以看到它可能会不稳定,并且必须将其明确应用于您打算使用的所有类型。就个人而言,我只是使用代码片段来插入代码(但是作为静态只读字段而不是属性来避免额外查找) –

+0

另外,我并不热衷于将ILog作为公开获取/设置会员;当然,这是你的财产注入。我想这完全是另一场辩论。 –

+0

'IIRC,Funq不太适合自动化财产注入 - 我恐怕你没有正确回忆它。 ServiceStack会为你做。看到我的答案。 –

回答

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(); 
    } 
} 
+0

Funq自动解决/应用属性注入吗?我不认为它(虽然内存朦胧) –

+0

是的,它会自动执行构造函数**和**属性注入。 –

+0

这很接近,但并不完全。我想获取具体类型的记录器,以便日志消息看起来像“2013-01-15 17:23:20.6192 | INFO | FooService | ...”而不是“2013-01-15 17:23: 20.6192 | INFO | IService | ...“ –