Autofac,如何使用Aspect的实例拦截服务但不使用Aspect的类型?

Mar*_*ris 8 .net c# aop ioc-container autofac

我有一个AutofacIoC容器.我想为某些类型注册Aspect.我可以这样做:

build.RegisterType(myType).As(ImyType).EnableInterfaceInterceptors().InterceptedBy(typeof(Aspect));
Run Code Online (Sandbox Code Playgroud)

但是如果我需要使用拦截器类型但是它的实例将拦截器注册到某些类中,该怎么办呢?让我们看看我认为它应该是这样的:

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

我是使用Ninject IoC这样做的.但是Autofac呢?Thx任何提前!

Tra*_*lig 10

查看Autofac.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>();
Run Code Online (Sandbox Code Playgroud)

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

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>();
Run Code Online (Sandbox Code Playgroud)

或者,如果您不希望键入方面,则可以使用命名拦截器.

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>();
Run Code Online (Sandbox Code Playgroud)

再次查看wiki - 有很多方法可以将拦截器与被拦截的类相关联,包括命名,类型,属性......维基上的大量示例.