在不使用容器的情况下从配置中截取统一

本文关键字:配置 截取 情况下 | 更新日期: 2023-09-27 18:21:08

嗨,我

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

我的代码:

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();
    }

这是有效的。我需要从配置文件配置它。请帮忙

在不使用容器的情况下从配置中截取统一

如果没有容器,则必须自己执行代理实例化。这是Intercept.ThroughProxy<>电话。如果您使用的是另一个容器,则可以扩展它以读取配置并相应地处理它。

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

当然,这有一个例外。如果您使用编织(Fody,PostSharp(,则可以在不使用动态代理的情况下进行AOP。然后,你实际上可以做new Calculator()它将具有它的方面,而不仅仅是它的核心实现......