The tracing layer wraps a trace-aware object around major services and formatters. Apps that need to downcast a service or formatter need a way to ask for the inner object instance.
I recommend we design for a general purpose wrapping API, not just tracing. Consider something like IWrappable<T> and Wrappable.Unwrap<T>(object). Make trace wrappers implement this and make MediaTypeFormatterCollection aware to use it.
Also fix OData code to use this when asking for the model from the ODataMediaTypeFormatter.
Comments: I wonder if the interface should have a property, and then use an extension method to do the actual unwrapping, in order to support multi-level wrapping (that is, you iterate to unwrap so long as what you get back continues to implement IWrappable<T>).
I recommend we design for a general purpose wrapping API, not just tracing. Consider something like IWrappable<T> and Wrappable.Unwrap<T>(object). Make trace wrappers implement this and make MediaTypeFormatterCollection aware to use it.
Also fix OData code to use this when asking for the model from the ODataMediaTypeFormatter.
Comments: I wonder if the interface should have a property, and then use an extension method to do the actual unwrapping, in order to support multi-level wrapping (that is, you iterate to unwrap so long as what you get back continues to implement IWrappable<T>).