PostSharp方面解析类型

4
我们正在使用依赖注入和控制反转(Unity)技术,现在我想使用PostSharp创建一个方面,基本上记录方法的进入/退出。我的问题是我的记录器已在 Unity 容器中配置和注册。在我的方面中解决记录器的最佳方法是什么?
注意:在 Unity 中使用拦截器不是一种选择。我希望这可以在没有通过 Unity 解析类的情况下工作。

为什么你想要将某些东西静态(后)编译到你的代码中,而不是使用拦截器保持它的动态和灵活性呢? - Mark Seemann
主要是因为这些类不是容器的一部分。 - Michael
2个回答

2
使用从OnMethodBoundaryAspect继承的方面,在OnMethodEntry / OnMethodExit中仅需从您的方面调用Unity以解析记录器,然后进行日志记录。
无论您想如何应用该方面(类、方法甚至是程序集级别)。
[Serializable]
    [MulticastAttributeUsage(MulticastTargets.Method, Inheritance=MulticastInheritance.Strict)]
    public class LogAspect : OnMethodBoundaryAspect
    {
        public override void OnEntry(MethodExecutionArgs args)
        {
            var Logger = Unity.Resolve<T>();
            Logger.Write(args.Method.Name + " enter");
        }

        public override void OnExit(MethodExecutionArgs args)
        {
            var Logger = Unity.Resolve<T>();
            Logger.Write(args.Method.Name + " exit");
        }
    }

为了获取您的Unity容器,我会使用服务定位器模式。
public class iocServiceLocator
    {
        private static readonly IUnityContainer _container;

        static iocServiceLocator()
        {
           _container = new UnityContainer();
        }

        public static void Initialize()
        {
            InitializeBootStrap();
        }

        private static void InitializeBootStrap()
        {
            //Register types here                        
        }

        public static T Get<T>()
        {
            return _container.Resolve<T>();
        }

        public static T Get<T>(string key)
        {
            return _container.Resolve<T>(key);
        }


    }

0

不使用服务定位器

在你的 Aspect 类中添加一个静态属性 logger

public class LogAspect : OnMethodBoundaryAspect
{
    /// <summary>
    /// Gets or sets the logger.
    /// </summary>
    public static ILogger logger { get; set; }

在您的应用程序初始化方法中使用ILogger类设置记录器变量,并使用AttributeExclude排除此初始化之前的所有方法。
    [LogAspect(AttributeExclude = true)]
    protected void Application_Start()
    {
        _windsorContainer = new WindsorContainer();
        ApplicationDependencyInstaller.RegisterLoggingFacility(_windsorContainer);
        LogAspect.logger = _windsorContainer.Resolve<ILogger>();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接