10

我有一个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 这样做。但是 Autofac 呢?感谢任何提前!

4

1 回答 1

12

查看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>();

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

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 上有很多示例。

于 2013-04-29T17:16:28.817 回答