代码之家  ›  专栏  ›  技术社区  ›  vishal mane

在不使用容器的情况下从配置进行统一拦截

  •  2
  • vishal mane  · 技术社区  · 10 年前

    嗨,我正在尝试使用统一拦截(我不想使用统一容器)。 我可以配置运行时,但不知道如何从配置中配置它。

    我的代码:

    public interface ICalculator
    {
        int Add(int first, int second);
    
        int Multiply(int first, int second);
    }
    

    行为:

      internal class LogBehavior : IInterceptionBehavior 
        {
            public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
            {
                // My Code
                IMethodReturn result = getNext()(input, getNext);
                return result;
            }
    
            public IEnumerable<Type> GetRequiredInterfaces()
            {
                return Type.EmptyTypes;
            }
    
            public bool WillExecute {
                get { return true; }
            }
        }
    

    这就是我所说的

        public static void Main(string[] args)
        {
    
            var calculator = new Calculator();
            var calculatorProxy = Intercept.ThroughProxy<ICalculator>(calculator,
              new InterfaceInterceptor(), new[] { new LogBehavior() });
            Console.WriteLine(calculatorProxy.Add(2, 2));
    
            Console.ReadKey();
        }
    

    这很有效。我需要从配置文件配置这个。 请帮忙

    1 回复  |  直到 10 年前
        1
  •  0
  •   BatteryBackupUnit    10 年前

    如果没有容器,您必须自己进行代理初始化。这就是 Intercept.ThroughProxy<> 呼叫如果您正在使用另一个容器,则可以扩展它以读取配置并相应地处理它。

    但没有什么神奇的地方,你可以让.net/unity读取配置文件 new Calculator() Calculator 将使用配置文件中定义的拦截器进行代理和拦截。 new 无法扩展以处理这一问题,因此,您必须请求某个组件的实例 ICalculator ,然后将检查是否需要代理以及需要哪些拦截器。。。

    当然,这也有例外。如果你使用编织( Fody , PostSharp )您可以在不使用动态代理的情况下执行AOP。然后,你可以 新计算器() 它将有它的方面,而不仅仅是它的核心实现。。。