Autofac перехватчик не работает для некоторых классов - PullRequest
1 голос
/ 21 ноября 2019

Мне нужно сделать дополнительный уровень логики для существующих классов. Я использую autofac.

Проект Windows service, имеющий также Kestrel сервер. Program.cs например

void Main(string[] args) {
   var customQueue = new CustomQueue();
   var someClass = new SomeClass(customQueue);
   var randomClass = new RandomClass();

   // do some logic here with using declared instances

   var server = new Server(someClass, randomClass);
   server.Start();
}

А вот и Server.cs

class Server {
   private IWebHost _host;

   public Server(SomeClass cls, RandomClass cls1) { 
         // set to fields
   }

   void Start() {
      _host = new WebHostBuilder()
                  .UseKestrel() 
                  .ConfigureServices(services => 
                  {
                      services.AddAutoFac(); // first as per doc in order to scaffold 'ConfigureContainer'?
                      services.AddSingleton(someClass); // fields
                      services.AddSingleton(randomClass); // fields
                  })
                  .UseContentRoot(Directory.GetCurrentDirectory())
                  .ConfigureAppConfiguration(...)
                  .ConfigureLogging(...);
                  .UseStartup<Startuo>()
                  .Build();
      _host.StartAsync(); 
   }
}

Startup.cs

public class Startup
{
    public ILifetimeScope AutofacContainer { get; private set; }

    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        // create a container-builder and register dependencies
        var builder = new ContainerBuilder();

        // populate the service-descriptors added to `IServiceCollection`
        // BEFORE you add things to Autofac so that the Autofac
        // registrations can override stuff in the `IServiceCollection`
        // as needed
        builder.Populate(services);
        builder.RegisterType<SomeClass>()
            .As<ISomeClass>()
            .EnableInterfaceInterceptors()
            .InterceptedBy(typeof(SomeClassInterceptor));
        builder.Register(_ => new SomeClassInterceptor());

        AutofacContainer = builder.Build();

        return new AutofacServiceProvider(AutofacContainer);
    }
}

И последнее SomeClassInterceptor.cs

public class SomeClassInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {

        try
        {

            invocation.Proceed();

            if (invocation.ReturnValue is Task taskResult)
            {
                taskResult.ContinueWith(
                    t =>
                    {
                        Console.WriteLine("OOHH YEAHH");
                    }, TaskContinuationOptions.None);
            }
            else
            {
                Console.WriteLine("WOW");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("EXCEPTIOOOOOOOOOOOOONNNNNNNNNNNNNNNNNNNN");
        }
    }
}

Я пробовал с Named и Typed регистрацией с атрибутом Intercept(...), но все еще безуспешно. Ничего не срабатывает. Также ISomeClass наследует другие интерфейсы, я пытался установить .As<>() также с теми, но нет.

Чего мне не хватает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...