PostSharp方面解析类型

时间:2011-04-20 13:03:50

标签: c# dependency-injection aop postsharp

我们正在使用依赖注入和IoC(Unity),现在我想用PostSharp创建一个基本上记录方法的进入/退出的方面。我的问题是我的记录器是在Unity容器中配置和注册的。在我方面解决记录器的最佳方法是什么?

注意:使用统一中的拦截器不是一种选择。我希望这项工作不通过团结来解决。

2 个答案:

答案 0 :(得分: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");
        }
    }

要获得统一容器,我会使用服务定位器模式。

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);
        }


    }

答案 1 :(得分:0)

没有服务定位器

在类Aspect

中添加静态属性记录器
public class LogAspect : OnMethodBoundaryAspect
{
    /// <summary>
    /// Gets or sets the logger.
    /// </summary>
    public static ILogger logger { get; set; }

使用ILogger类在应用程序init方法中设置logger变量,并在使用AttributeExclude进行初始化之前排除所有方法。

    [LogAspect(AttributeExclude = true)]
    protected void Application_Start()
    {
        _windsorContainer = new WindsorContainer();
        ApplicationDependencyInstaller.RegisterLoggingFacility(_windsorContainer);
        LogAspect.logger = _windsorContainer.Resolve<ILogger>();