Тип разрешения аспектов PostSharp - PullRequest
4 голосов
/ 20 апреля 2011

Мы используем внедрение зависимостей с помощью и IoC (Unity), и теперь я хочу создать аспект с PostSharp, который бы в основном регистрировал вход / выход метода. Моя проблема в том, что мой регистратор настроен и зарегистрирован в контейнере Unity. Какой должен быть наилучший подход для разрешения логгера в моем аспекте?

Примечание: использование перехватчиков в единстве не вариант. Я хочу, чтобы это работало без того, чтобы класс решался через единство.

Ответы [ 2 ]

2 голосов
/ 20 апреля 2011

используйте аспект, который наследуется от 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 голосов
/ 14 марта 2013

без сервисного локатора

добавить регистратор статических свойств в ваш класс Aspect

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

установите переменную logger в вашем методе init приложения с вашим классом ILogger и исключите все методы перед этой инициализацией с помощью AttributeExclude.

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