UmbracoAOP is a project looking into how Aspect Oriented Programming can be applied to general Umbraco tasks. Such as subscribing to Umbraco events!
Event Subscriber allows developers to easily subscribe to Umbraco events, without worrying about all the plumbing. This tool will allow you to subscribe to all ContentService and MediaService events. Event Subscriber also allows you to filter by content type alias or media type alias when your function should be called.
Here's how you would subscribe to the Content Service publish event with Event Subscriber:
public class BlogPost
{
//run on all Published events
[UmbracoEvent]
public static void WhenPublished(IPublishingStrategy sender,
Umbraco.Core.Events.PublishEventArgs<Umbraco.Core.Models.IContent> e)
{
//do something
}
//run only when a BlogPost is published
[UmbracoEvent( "BlogPost" )]
public static void BlogPost_OnPublished(IPublishingStrategy sender,
Umbraco.Core.Events.PublishEventArgs<Umbraco.Core.Models.IContent> e)
{
//do something
}
}
Here's how you could subscribe to the publish event currently:
public class Startup : ApplicationEventHandler
{
public Startup()
{
ContentService.Published += Published;
ContentService.Published += FilteredPublished;
}
void Published(IPublishingStrategy sender,
Umbraco.Core.Events.PublishEventArgs<Umbraco.Core.Models.IContent> e)
{
//do something
}
void FilteredPublished(IPublishingStrategy sender,
Umbraco.Core.Events.PublishEventArgs<Umbraco.Core.Models.IContent> e)
{
if (e.PublishedEntities.Any(c => c.ContentType.Alias == "BlogPost" ||
c.ContentType.Alias == "BlogFolder"))
{
//do something
}
}
}
Event Subscriber detects the method signature and a method suffix. The suffix is the name of the event - for example Saved, Saving, Published, Publishing, Copied, Moved, etc.
For example
[UmbracoEvent]
public static void WhenSaved(IContentService sender,
Umbraco.Core.Events.SaveEventArgs<Umbraco.Core.Models.IContent> e)
{
//do something
}
The function name is WhenSaved. The beginning part of the method name can be named however you like. It can even be 'IHopeThisIsSaved'.
The parameters must match the parameters required by the Umbraco Service events.
You can also specify when your event method should be called based on the Target Type Alias (Content, Media etc).
Here is an example of a method that should only be called when a BlogPost is unpublished:
[UmbracoEvent( "BlogPost" )]
public static void BlogPost_OnPublished(IContentService sender,
Umbraco.Core.Events.SaveEventArgs<Umbraco.Core.Models.IContent> e)
{
//do something
}
You can also specify multiple types:
[UmbracoEvent( "BlogPost", "BlogFolder" ) )]
public static void BlogPost_OnPublished(IContentService sender,
Umbraco.Core.Events.SaveEventArgs<Umbraco.Core.Models.IContent> e)
{
//do something
}
You can install via NuGet:
PM> Install-Package UmbracoAOP.EventSubscriber
The source code is under MIT license.
You can contribute or download the source here: https://github.com/base33/UmbracoAOP
The branch for this code is in "UmbracoE".
Please log issues here: https://github.com/base33/UmbracoAOP/issues
You can also tweet me if you have any questions: @CraigNoble1989
If you experience any issues, please refer to the correct Event signature (event and sender):
Content Service: http://our.umbraco.org/documentation/Reference/Events-v6/ContentService-Events
Media Service: http://our.umbraco.org/documentation/reference/events-v6/MediaService-Events
Upgrading from 1.0 to >=1.1:
Once you have installed the latest verion, either via Nuget or the package installer, here are some tips on updating your code:
- Change [ContentEvent.EventName] to just [UmbracoEvent]
- Change [ContentEvent.EventName( "BlogPost" )] to [UmbracoEvent("BlogPost")]
- Append the name of the event to the end of your method name. The name of the event can be found here: http://our.umbraco.org/documentation/Reference/Events-v6/ContentService-Events