Можно ли использовать аспектно-ориентированный подход для входа в функцию Azure с помощью Autofac и DynamicProxy по направлениям:
https://nearsoft.com/blog/aspect-oriented-programming-aop-in-net-core-and-c-using-autofac-and-dynamicproxy/
Я исследовал следующие ссылки
- http://codingsoul.de/2018/01/19/azure-function-dependency-injection-with-autofac/
- https://blog.wille -zone.de / post / azure-functions-Proper-зависимость-инъекция /
- 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);
}
}
}