I'm not sure I'd go so far as to call it a good tutorial but if you watch this video there's a short demo of how to write donut caching at about 36 minutes in.
How to do it boils down to:
Add output caching to your pages.
Decide what items need injecting into your cached pages before they get returned to the client.
For each item, create a static
(Shared
in VB) method that returns the item e.g.
Public Shared Function LoginName(ByVal context As HttpContext) As String
Return "Welcome, " & context.User.Identity.Name
End Function
Add a Substition
control to your page in the appropriate location for each item, which calls the method you just created.
<asp:Substitution runat="server" ID="LoginNameSubstitution" MethodName="LoginName" />
And you're done!