view Extensions/JointureAddOn/Mapping/LazyValueLoadInterceptor.cs @ 4:f757da6161a1

!bug 100 + 2h fixed gregression
author cin
date Sun, 24 Aug 2014 17:57:42 +0400
parents f990fcb411a9
children
line wrap: on
line source

using System;
using Castle.DynamicProxy;
using IInterceptor = Castle.DynamicProxy.IInterceptor;

namespace BLToolkit.Mapping
{
    public class LazyValueLoadInterceptor : IInterceptor
    {
        #region Fields

        private readonly IObjectMapper _mapper;
        private readonly Func<IMapper, object, Type, object> _lazyLoader;
        private bool _intercepted;

        #endregion

        public LazyValueLoadInterceptor(IObjectMapper mapper, Func<IMapper, object, Type, object> lazyLoader)
        {
            _mapper = mapper;
            _lazyLoader = lazyLoader;
        }

        public void Intercept(IInvocation invocation)
        {
            if (invocation.Method.Name.StartsWith("get_"))
            {
                string propertyName = invocation.Method.Name.Substring(4);

                foreach (IMapper map in _mapper.PropertiesMapping)
                {
                    if (map.PropertyName == propertyName)
                    {
                        if (!_intercepted)
                        {
                            _intercepted = true;
                            map.Setter(invocation.Proxy, _lazyLoader(map, invocation.Proxy, invocation.TargetType));
                        }
                        break;
                    }
                }
            }

            // let the original call go through first, so we can notify *after*
            invocation.Proceed();
        }
    }
}