Autofac,如何用Aspect的实例而不是用Aspect的Type来拦截服务

本文关键字:Aspect Type 服务 何用 实例 Autofac | 更新日期: 2023-09-27 18:11:23

我有一个Autofac作为IoC容器。我想为某些类型注册Aspect。我可以这样做:

build.RegisterType(myType).As(ImyType).EnableInterfaceInterceptors().InterceptedBy(typeof(Aspect));

但是,如果我需要注册拦截器到一些类使用不是一个类型的拦截器,但它的实例。让我们看看我认为它应该是什么样子:

Aspect aspectInstance = new Aspect("some data to constructor")
build.RegisterType(myType).As(ImyType).EnableInterfaceInterceptors().InterceptedBy(aspectInstance);

我是使用Ninject IoC这样做的。那么autoface呢?谢谢任何预付款!

Autofac,如何用Aspect的实例而不是用Aspect的Type来拦截服务

查看autoface . extras . dynamicproxy2上的Autofac wiki页面。它显示了一个CallLogger拦截器的示例,其中注册了一个lambda作为拦截器:

var builder = new ContainerBuilder(); 
builder.RegisterType<SomeType>()
       .As<ISomeInterface>()
       .EnableInterfaceInterceptors(); 
builder.Register(c => new CallLogger(Console.Out));
var container = builder.Build();
var willBeIntercepted = container.Resolve<ISomeInterface>();

对于您的情况,只需将其切换为注册实例。

var builder = new ContainerBuilder(); 
builder.RegisterType<SomeType>()
       .As<ISomeInterface>()
       .EnableInterfaceInterceptors()
       .InterceptedBy(typeof(Aspect));
var interceptor = new Aspect();
builder.RegisterInstance(interceptor);
var container = builder.Build();
var willBeIntercepted = container.Resolve<ISomeInterface>();

或者,如果你不希望你的方面被键入,你可以使用命名拦截器。

var builder = new ContainerBuilder(); 
builder.RegisterType<SomeType>()
       .As<ISomeInterface>()
       .EnableInterfaceInterceptors()
       .InterceptedBy("my-aspect-instance");
var interceptor = new Aspect();
builder.RegisterInstance(interceptor)
       .Named<IInterceptor>("my-aspect-instance");
var container = builder.Build();
var willBeIntercepted = container.Resolve<ISomeInterface>();

再一次,查看wiki -有很多方法可以将拦截器与被拦截的类关联起来,包括命名,类型,属性…wiki上有很多示例