Можно ли использовать аспектно-ориентированный подход для входа в функцию Azure с помощью Autofac и DynamicProxy - PullRequest
0 голосов
/ 27 мая 2018

Можно ли использовать аспектно-ориентированный подход для входа в функцию Azure с помощью Autofac и DynamicProxy по направлениям:

https://nearsoft.com/blog/aspect-oriented-programming-aop-in-net-core-and-c-using-autofac-and-dynamicproxy/

Я исследовал следующие ссылки

  1. http://codingsoul.de/2018/01/19/azure-function-dependency-injection-with-autofac/
  2. https://blog.wille -zone.de / post / azure-functions-Proper-зависимость-инъекция /
  3. http://autofaccn.readthedocs.io/en/latest/advanced/interceptors.html

, а затем попытался расширить пост Хольгера Лейхсенринга (# 1) с помощью приведенного ниже кода.Однако функция Intercept () никогда не запускалась.Есть идеи?

Дополнительные ссылки на Nuget (вам также необходимо понизить Autofac до 4.0.1)

using Autofac.Extras.DynamicProxy;
using Castle.DynamicProxy;

TestIt

Добавить перехватчик и функцию с параметром ...

[Intercept(typeof(ICallLogger))]
public class TestIt : ITestIt
{
    public string Name { get; set; }

    public string CallMe()
    {
        return "Dependency Injection Test method had been called...";
    }

    public string CallMeWithParameter(string parameter)
    {
        return "Dependency Injection Test method had been called with [" + parameter + "]";
    }
}

ServicesModule

public class ServicesModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<CallLogger>().As<ICallLogger>();
        builder.RegisterType<TestIt>().As<ITestIt>().EnableClassInterceptors();

        // How can you pass context to the AutoFac.ServicesModule()? Commenting out for now and using parameterless constructor instead.
        // builder.Register(c => new CallLogger(context.Trace)).Named<IInterceptor>("log-calls");

        // Switch to use Type based interceptor attribute instead of Name based interceptor attribute
        // builder.Register(c => new CallLogger()).Named<IInterceptor>("log-calls");

    }
}

CallLogger

public interface ICallLogger
{
    void Intercept(IInvocation invocation);
}

/// <summary>
/// Logging class that would hopefully wrap TraceWriter - trying the Debug Output Window for now...
/// </summary>
public class CallLogger : IInterceptor, ICallLogger
{
    TraceWriter _log;

    public CallLogger(TraceWriter log)
    {
        _log = log;
    }

    public CallLogger()
    {
        _log = null;
    }

    public void Intercept(IInvocation invocation)
    {
        string message = string.Empty;

        message = "Calling method {0} with parameters {1}... " +
                  invocation.Method.Name +
                  string.Join(", ", invocation.Arguments.Select(a => (a ?? "").ToString()).ToArray());

        if (_log != null)
        {
            _log.Info(message);
        }

        Debug.WriteLine(message);

        invocation.Proceed();

        message = "Done: result was {0}." + invocation.ReturnValue;
        Debug.WriteLine(message);

        if (_log != null)
        {
            _log.Info(message);
        }
    }
}
...