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吗?现在
IIRC,Funq不能很好地适用于自动化财产注射。我想你可以实现任何类型的'InitializedBy'部分并让它分配合适的记录器。所以'container.Register>(()=> new FooService())。InitializedBy((c,foo)=> foo.Log = c.Resolve (typeof(FooService))''但是你可以看到它可能会不稳定,并且必须将其明确应用于您打算使用的所有类型。就个人而言,我只是使用代码片段来插入代码(但是作为静态只读字段而不是属性来避免额外查找) –
另外,我并不热衷于将ILog作为公开获取/设置会员;当然,这是你的财产注入。我想这完全是另一场辩论。 –
'IIRC,Funq不太适合自动化财产注入 - 我恐怕你没有正确回忆它。 ServiceStack会为你做。看到我的答案。 –