Реальная проблема реализации прокси при попытке разорвать конвейер в C#

AuthenticationProxy.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Messaging;
using System.Reflection;
using System.Threading;

namespace ProxyWithAOP
{
public class AuthenticationProxy<T> : RealProxy
{
    private readonly T _decorated;
    public AuthenticationProxy(T decorated)
      : base(typeof(T))
    {
        _decorated = decorated;
    }

    private void Log(string msg, object arg = null)
    {
        Console.ForegroundColor = ConsoleColor.Green;
        Console.WriteLine(msg, arg);
        Console.ResetColor();
    }

    public override IMessage Invoke(IMessage msg)
    {
        var methodCall = msg as IMethodCallMessage;
        var methodInfo = methodCall.MethodBase as MethodInfo;

        if (Thread.CurrentPrincipal.IsInRole("ADMIN"))
        {
            try
            {
                Log("User authenticated - You can execute '{0}' ", methodCall.MethodName);

                var result = methodInfo.Invoke(_decorated, methodCall.InArgs);

                return new ReturnMessage(result, null, 0, methodCall.LogicalCallContext, methodCall);
            }
            catch (Exception e)
            {
                Log(string.Format("User authenticated - Exception {0} executing '{1}'", e), methodCall.MethodName);

                return new ReturnMessage(e, methodCall);
            }
        }

        Log("User not authenticated - You can't execute '{0}' ", methodCall.MethodName);

        return new ReturnMessage(-1, null, 0, methodCall.LogicalCallContext, methodCall);
    }
}
}

DynamicProxy.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Messaging;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace ProxyWithAOP
{
class DynamicProxy<T> : RealProxy
{
    private readonly T _decorated;

    public DynamicProxy(T decorated)
      : base(typeof(T))
    {
        _decorated = decorated;
    }

    private void Log(string msg, object arg = null)
    {
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine(msg, arg);
        Console.ResetColor();
    }

    public override IMessage Invoke(IMessage msg)
    {
        var methodCall = msg as IMethodCallMessage;
        var methodInfo = methodCall.MethodBase as MethodInfo;

        Log("In Dynamic Proxy - Before executing '{0}'", methodCall.MethodName);

        try
        {
            var result = methodInfo.Invoke(_decorated, methodCall.InArgs);

            Log("In Dynamic Proxy - After executing '{0}' ", methodCall.MethodName);

            return new ReturnMessage(result, null, 0, methodCall.LogicalCallContext, methodCall);
        }
        catch (Exception e)
        {
            Log(string.Format("In Dynamic Proxy- Exception {0} executing '{1}'", e), methodCall.MethodName);

            return new ReturnMessage(e, methodCall);
        }
    }
}
}

Я объявил два метода как -int GetCustomer(T entity); а также double GetBalance(T entity);

Добавлены методы в конвейер как

var decorated = TraceProxy<ICustomerOperations>.Create(new CustomerOperations());
decorated = AuthenticationProxy<ICustomerOperations>.Create(decorated);

Теперь я вызываю методы своих клиентов, используя декоратор как

decorated.GetCustomer(1);
decorated.GetBalance(1);

вышеупомянутые методы имеют различный тип возврата как int и string.
Когда пользователь не аутентифицирован в классе AuthenticationProxy, он возвращает объект как return new ReturnMessage(-1, null, 0, methodCall.LogicalCallContext, methodCall);(Метод вызова Authentication.cs)

decorated.GetCustomer(1); вызов был успешным, так как тип возвращаемого значения совпадает с int, тем не мение decorated.GetBalance(1); бросает InvalidCastException исключение как исключение double возвращаемое значение типа.

Так как решить эту проблему? Я хочу сделать его универсальным, чтобы не было проблемы с типом возвращаемого значения.

0 ответов

Другие вопросы по тегам