Maybe for some next releases it's a good idea to make some important methods in BLL and the top layer instead of public static methods
public static virtual methods.
In this case a developer can alter a method with public static override [methodtype] [methodname] without deleting the original method.
Or use some kind of event dispatcher so developers can hook into an method and decide what to do, continue the method like it should, fetch
the data if the method provides some and alter the data or completly rewrite the method and than let the method execute like it normally should.
so you could use something like this
foreach(Delegate handlesomething in this.EventHandlerDelegate.GetInvocationList())
{
handlesomething.DynamicInvoke(args);
}