Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>In case any of you are interested, I had to change the way I did this because it was checking connection at <strong>Constructor Level</strong>, and I needed that check at <strong>Operation Level</strong>.</p> <pre><code>using System; using Microsoft.Practices.Unity; using Microsoft.Practices.Unity.InterceptionExtension; namespace ConsoleApplication1 { public enum ConnectionStatus { Online, Offline, System // System checks connectivity } public static class Connectivity { private static ConnectionStatus ConnectionStatus = ConnectionStatus.Offline; public static void ForceConnectionStatus(ConnectionStatus connectionStatus) { ConnectionStatus = connectionStatus; } public static bool IsConnected() { switch (ConnectionStatus) { case ConnectionStatus.Online: return true; case ConnectionStatus.Offline: return false; case ConnectionStatus.System: return CheckConnection(); } return false; } private static bool CheckConnection() { return true; } } public class Unity { public static IUnityContainer Container; public static void Initialize() { Container = new UnityContainer(); Container.AddNewExtension&lt;Interception&gt;(); Container.RegisterType&lt;ILogger, OnlineLogger&gt;(); Container.Configure&lt;Interception&gt;().SetInterceptorFor&lt;ILogger&gt;(new InterfaceInterceptor()); } } class Program { static void Main(string[] args) { Unity.Initialize(); var r = new Router&lt;ILogger, OnlineLogger, OnlineLogger&gt;(); Connectivity.ForceConnectionStatus(ConnectionStatus.Offline); Console.WriteLine("Calling Online, will attend offline: "); r.Logger.Write("Used offline."); Connectivity.ForceConnectionStatus(ConnectionStatus.Online); Console.WriteLine("Calling Online, will attend online: "); r.Logger.Write("Used Online. Clap Clap Clap."); Console.ReadKey(); } } public class Router&lt;TContract, TOnline, TOffline&gt; where TOnline : TContract where TOffline : TContract { public TContract Logger; public Router() { Logger = Unity.Container.Resolve&lt;TContract&gt;(); } } public interface IOnline { IOffline Offline { get; set; } } public interface IOffline { } public interface ILogger { [Test()] void Write(string message); } public class OnlineLogger : ILogger, IOnline { public IOffline Offline { get; set; } public OnlineLogger() { this.Offline = new OfflineLogger(); } public void Write(string message) { Console.WriteLine("Online Logger: " + message); } } public class OfflineLogger : ILogger, IOffline { public IOnline Online { get; set; } public void Write(string message) { Console.WriteLine("Offline Logger: " + message); } } [System.Diagnostics.DebuggerStepThroughAttribute()] public class TestAttribute : HandlerAttribute { public override ICallHandler CreateHandler(IUnityContainer container) { return new TestHandler(); } } public class TestHandler : ICallHandler { public int Order { get; set; } public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) { Console.WriteLine("It's been intercepted."); if (!Connectivity.IsConnected() &amp;&amp; input.Target is IOnline) { Console.WriteLine("It's been canceled."); var offline = ((input.Target as IOnline).Offline); if (offline == null) throw new Exception("Online class did not initialized Offline Dispatcher."); var offlineResult = input.MethodBase.Invoke(offline, this.GetObjects(input.Inputs)); return input.CreateMethodReturn(offlineResult, this.GetObjects(input.Inputs)); } return getNext()(input, getNext); } private object[] GetObjects(IParameterCollection parameterCollection) { var parameters = new object[parameterCollection.Count]; int i = 0; foreach (var parameter in parameterCollection) { parameters[i] = parameter; i++; } return parameters; } } } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload