As explained previously, IModelModifiedBroker is an interface for an object whose instance is shared throughout the model and raises events that describe changes to the model. In this way we can keep loosely coupled object relatively free of unnecessary relationships, as well as allow all code that affects an object to be handled by the object itself.
This interface is relatively simple to understand. Its events allow an object to report change to the Broker, which fire events that other objects in the model can subscribe to.
In the past I have used this pattern by providing a certain amount of boiler plate code in relevant propertys and functions in a class to report changes to the Broker. However, one of my goals in Norman is to avoid as much boiler plate code as possible. To this end I have used Post Sharp to allow properties to be decorated with the BrokeredPropertyAttribute and BrokeredActivationPropertyAttribute which will automatically fire the relevant events when a Creation, Deletion (Deactivation), Modification or Rename occurs.
The engine itself will handle the firing of the Revert events, which fire when Revert is called on the model or on an object, to 'undo' any changes since the model was last loaded.
The DisableEvents boolean should be used in any implementation of the interface to stop events firing if it is set to true. This is used primarily by the engine to avoid cascading reports during a Model Revert function.
An implementation of IModelModifiedBroker is provided, however a custom implementation can also be substituted, in case the Broker requires to be extended.
public class ModelModifiedBroker : IModelModifiedBroker
{
public ModelModifiedBroker()
{
DisableEvents = false;
}
public void FireModelReverting(object sender, ModelRevertingEventArgs e)
{
if (!DisableEvents && ModelRevertingFired != null)
ModelRevertingFired(sender, e);
}
public void FireObjectReverting(object sender, ObjectRevertingEventArgs e)
{
if (!DisableEvents && ObjectRevertingFired != null)
ObjectRevertingFired(sender, e);
}
public void FireModelReverted(object sender, ModelRevertedEventArgs e)
{
if (!DisableEvents && ModelRevertedFired != null)
ModelRevertedFired(sender, e);
}
public void FireObjectReverted(object sender, ObjectRevertedEventArgs e)
{
if (!DisableEvents && ObjectRevertedFired != null)
ObjectRevertedFired(sender, e);
}
public void FireCreated(object sender, ObjectCreatedEventArgs e)
{
if (!DisableEvents && CreateFired != null)
CreateFired(sender, e);
}
public void FireDeletion(object sender, ObjectDeletedEventArgs e)
{
if (!DisableEvents && DeletionFired != null)
DeletionFired(sender, e);
}
public void FireModify(object sender, ObjectModifiedEventArgs e)
{
if (!DisableEvents && ModifyFired != null)
ModifyFired(sender, e);
}
public void FireRename(object sender, ObjectRenamedEventArgs e)
{
if (!DisableEvents && RenameFired != null)
RenameFired(sender, e);
}
public event ObjectCreatedHandler CreateFired;
public event ObjectDeletedHandler DeletionFired;
public event ObjectModifiedHandler ModifyFired;
public event ObjectRenamedHandler RenameFired;
public event ModelRevertingHandler ModelRevertingFired;
public event ObjectRevertingHandler ObjectRevertingFired;
public event ModelRevertedHandler ModelRevertedFired;
public event ObjectRevertedHandler ObjectRevertedFired;
public bool DisableEvents { get; set; }
}
