Executing code in constraint context C# with Example



Executing code in constraint context C# with Example

If you have code (a routine) you want to execute under a specific (constraint) context, you can use dependency 
injection. 
The following example shows the constraint of executing under an open SSL connection. This first part would be in 
your library or framework, which you won't expose to the client code. 
public static class SSLContext 
{ 
// define the delegate to inject 
public delegate void TunnelRoutine(BinaryReader sslReader, BinaryWriter sslWriter); 
// this allows the routine to be executed under SSL 
public static void ClientTunnel(TcpClient tcpClient, TunnelRoutine routine) 
{ 
using (SslStream sslStream = new SslStream(tcpClient.GetStream(), true, _validate)) 
{ 
sslStream.AuthenticateAsClient(HOSTNAME, null, SslProtocols.Tls, false); 
if (!sslStream.IsAuthenticated) 
{ 
throw new SecurityException("SSL tunnel not authenticated"); 
} 
if (!sslStream.IsEncrypted) 
{ 
throw new SecurityException("SSL tunnel not encrypted"); 
} 
using (BinaryReader sslReader = new BinaryReader(sslStream)) 
using (BinaryWriter sslWriter = new BinaryWriter(sslStream)) 
{ 
routine(sslReader, sslWriter); 
} 
} 
} 
} 
Now the client code which wants to do something under SSL but does not want to handle all the SSL details. You 
can now do whatever you want inside the SSL tunnel, for example exchange a symmetric key: 
public void ExchangeSymmetricKey(BinaryReader sslReader, BinaryWriter sslWriter) 
{ 
byte[] bytes = new byte[8]; 
(new RNGCryptoServiceProvider()).GetNonZeroBytes(bytes); 
sslWriter.Write(BitConverter.ToUInt64(bytes, 0)); 
} 
You execute this routine as follows: 
SSLContext.ClientTunnel(tcpClient, this.ExchangeSymmetricKey); 
To do this, you need the using() clause because it is the only way (apart from a try..finally block) you can 
guarantee the client code (ExchangeSymmetricKey) never exits without properly disposing of the disposable 
resources. Without using() clause, you would never know if a routine could break the context's constraint to 
dispose of those resources. 
 

0 Comment's

Comment Form

Submit Comment