using System.Reflection; using Microsoft.Practices.Unity; using Microsoft.Practices.Unity.InterceptionExtension; using Portoa.Persistence; using Portoa.Search; using VideoGameQuotes.Api; namespace VideoGameQuotes.Web.Configuration { public class UpdateSearchIndex : UnityContainerExtension { protected override void Initialize() { Container .Configure() .AddPolicy("UpdateSearchIndexPolicy") .AddCallHandler() .AddMatchingRule(); } } public class QuoteUpdatedMatchingRule : IMatchingRule { private static readonly MethodBase saveMethod = typeof(IRepository).GetMethod("Save", new[] { typeof(Quote) }); public bool Matches(MethodBase member) { return member == saveMethod; } } public class UpdateSearchIndexCallHandler : ICallHandler { private readonly IUnityContainer container; /// /// Can't inject ISearchIndexBuilder because it causes an infinite loop /// while trying to instantiate the call handler. So we do a later resolve /// on the index builder so that this shit fucking works. /// public UpdateSearchIndexCallHandler(IUnityContainer container) { this.container = container; } public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) { var returnValue = getNext()(input, getNext); if (returnValue.Exception != null) { //if the update failed then just return return returnValue; } var quote = returnValue.ReturnValue as Quote; if (quote == null || !quote.ShouldIndex) { return returnValue; } container.Resolve>().UpdateIndex(quote); return returnValue; } public int Order { get; set; } } }