我需要在我的域中记录很多东西,因此我的大多数域和应用程序服务都依赖于日志记录实现。让我们说我创建了这份小合同:
public interface ILogger {
void Info(string message);
}
大。现在我实现了基于log4net的基础结构服务:
public class Log4NetProxy : ILogger {
private ILog _logger = LogManager.GetLogger();
public void Info(string message) {
_logger.Info(message);
}
}
但是,由于我的大多数类都有其他依赖而不仅仅是记录器,因此我越来越接近构造函数的注入模式。
public class MyService : IMyService {
public MyService(ILogger logger, IRepository repo, IAlsoNeedSettings settings) {
}
}
如何避免注入诸如设置或日志记录等基本核心要求,只关注我真正需要的依赖关系?物业注入?服务外墙?静态日志工厂?
答案 0 :(得分:1)
[关于拦截器的Rant +代码被删除,因为这不是你需要的东西:)]
我发现属性注入通常是要走的路,因为它避免了通常不那么有趣的样板代码
...我将构造函数值中的第一个ISomething分配给 财产...
我不知道如何在Autofac中使用它(我主要使用Castle.Windsor),但我推荐它作为一种低维护和避免构造函数膨胀的好方法
编辑:显然,Mark Seemann提到拦截是一种处理这些案件的有效方式,所以我会放回原来的咆哮+代码。我不确定它与他所指的相符,但它可能会给你一些想法
我非常喜欢Castle-Windsor拦截系统,它有点像面向方面编程,你可以将已解析的组件包装在拦截器中,然后根据参数,方法名称等决定如何操作
这是我的拦截记录器的一个例子:
public class LoggingInterceptor: IInterceptor
{
public void Intercept(IInvocation invocation)
{
using (Tracer t = new Tracer(string.Format("{0}.{1}", invocation.TargetType.Name, invocation.Method.Name)))
{
StringBuilder sb = new StringBuilder(100);
sb.AppendFormat("IN (", invocation.TargetType.Name, invocation.Method.Name);
sb.Append(string.Join(", ", invocation.Arguments.Select(a => a == null ? "null" : DumpObject(a)).ToArray()));
sb.Append(")");
t.Verbose(sb.ToString());
invocation.Proceed();
sb = new StringBuilder(100);
sb.AppendFormat("OUT {0}", invocation.ReturnValue != null ? DumpObject(invocation.ReturnValue) : "void");
t.Verbose(sb.ToString());
}
}
private string DumpObject(object argument)
{
// serialize object
}
}
然后在设置期间注册此logger拦截器并将其应用于WCF服务中的有趣类:
// register interceptors
_container.Register(
Classes.FromAssemblyInThisApplication()
.BasedOn<IInterceptor>()
.WithServiceBase()
.Configure(c => c.Named(c.Implementation.Name))
);
// apply them
_container.Register
(
Component.For<IService>()
.ImplementedBy<ServicesImplementation.Service>()
.Named("Service")
.LifestylePerWcfOperation()
.Interceptors("LoggingInterceptor")
);
您可以考虑拦截对需要ILogger或具有ILogger属性的类的方法的调用,并从拦截器中注入它。