Dependency injection 如何使用依赖注入从postsharp方面解决日志依赖

Dependency injection 如何使用依赖注入从postsharp方面解决日志依赖,dependency-injection,unity-container,nlog,postsharp,Dependency Injection,Unity Container,Nlog,Postsharp,因此,我正在使用NLog和Postsharp建立一个项目。我有一个OnMethodBoundaryAspect属性子体来修饰类,并为日志记录提供拦截执行。我的DI容器是Unity 因此,单独使用DI(而不是ServiceLocator),如何解析aspect类中的日志对象以提供日志记录?在过去,我曾使用ServiceLocator来解析日志对象,但我正试图摆脱它,因为我真的开始相信ServiceLocator真的是一种反模式(是的,我知道在这个问题上有一点圣战) 谢谢 在类特性中添加静态属性记录

因此,我正在使用NLog和Postsharp建立一个项目。我有一个OnMethodBoundaryAspect属性子体来修饰类,并为日志记录提供拦截执行。我的DI容器是Unity

因此,单独使用DI(而不是ServiceLocator),如何解析aspect类中的日志对象以提供日志记录?在过去,我曾使用ServiceLocator来解析日志对象,但我正试图摆脱它,因为我真的开始相信ServiceLocator真的是一种反模式(是的,我知道在这个问题上有一点圣战)


谢谢

在类特性中添加静态属性记录器

public class LogAspect : OnMethodBoundaryAspect
{
    /// <summary>
    /// Gets or sets the logger.
    /// </summary>
    public static ILogger logger { get; set; }
公共类LogAspect:OnMethodBoundaryAspect
{
/// 
///获取或设置记录器。
/// 
公共静态ILogger记录器{get;set;}
使用ILogger类在应用程序init方法中设置logger变量,并在此初始化之前使用AttributeExclude排除所有方法

    [LogAspect(AttributeExclude = true)]
    protected void Application_Start()
    {
        _windsorContainer = new WindsorContainer();
        ApplicationDependencyInstaller.RegisterLoggingFacility(_windsorContainer);
        LogAspect.logger = _windsorContainer.Resolve<ILogger>();
[LogAspect(AttributeExclude=true)]
受保护的无效应用程序\u Start()
{
_windsorContainer=新windsorContainer();
ApplicationDependencyInstaller.RegisterLoggingFacility(_windsorContainer);
LogAspect.logger=\u windsorContainer.Resolve();

Update-我正在考虑创建一个定制的TraceListener来包装NLog,然后将其添加到System.Diagnostic.Trace.Listeners中。然后在方面,我可以直接写入该文件。DI和一个容器为AOP提供了一种可靠的方法。如果您正确地建模系统,您可以轻松地配置包含日志的装饰程序。或者即使您没有这样做,使用Unity,您可以执行拦截以启用日志记录。为什么您认为您仍然需要PostSharp?我以前使用过Unity拦截,但无法处理性能开销。我使用PostSharp是因为我不想处理必须编写所有装饰器管道代码的问题。回想起来,我可能只使用环境上下文tern使整个appdomain都可以使用日志记录。一个好的应用程序设计(遵循这些原则)您几乎不需要这样做。例如,您可以围绕系统进行设计,这样您就可以编写一个用于日志记录的修饰符,该修饰符可以应用于系统中的所有操作。性能与代码编织一样好,甚至可能更好,因为您的应用程序将包含更少的MSIL。