C# 如何在Autofac中从单点操作注册

C# 如何在Autofac中从单点操作注册,c#,autofac,C#,Autofac,我用温莎城堡操纵注册。例如,Windsor的内核有一个名为ComponentRegistered的事件,如果给定的服务/组件具有特定属性,我可以在其中注册该事件并向服务添加拦截器。例如: handler.ComponentModel .Interceptors.Add(new InterceptorReference(typeof(UnitOfWorkInterceptor))); 我可以通过检查handler.ComponentModel.Implementation类型来实现

我用温莎城堡操纵注册。例如,Windsor的内核有一个名为ComponentRegistered的事件,如果给定的服务/组件具有特定属性,我可以在其中注册该事件并向服务添加拦截器。例如:

handler.ComponentModel
       .Interceptors.Add(new InterceptorReference(typeof(UnitOfWorkInterceptor)));
我可以通过检查handler.ComponentModel.Implementation类型来实现这个条件


我正在Autofac中查找一个类似的钩子,但找不到它。

您可以使用
模块和
附件组件注册
方法执行相同的操作。每次注册(现在和将来)都将触发此方法

您还可以使用本机castle插件:

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=newcontainerbuilder();
builder.RegisterType()
.As()
.EnableInterfaceInterceptors();
注册(c=>newcalllogger(Console.Out));
var container=builder.Build();
var willBeIntercepted=container.Resolve();

有关更多信息,请参见Autofac文档

,非常感谢。我不想在服务注册时使用它来避免为每个服务重复添加拦截器。我想按照惯例为特定的接口创建它。所以,第一个解决方案似乎是一个很好的解决方案,但最好有更多的机会,而不仅仅是替换实例。在一个中心位置有相同的注册API会很好。@hikalkan我不确定你想要什么。您可以在模块中做任何您想做的事情。你能解释一下遗漏了什么吗?我想截取类(使用动态类代理截取)。我不想在builder上那样做注册。。。因为我有一个约定:如果一个服务实现了一个特定的接口或具有一个特定的属性,那么不管它是向EnableInterfaceInterceptors注册的还是被方法拦截的,它都应该被自动拦截。那么,我如何实现这个约定呢?我从来没有使用castle Autofac的插件,因为我总是使用Autofac模块实现自定义逻辑。Autofac模块可以使用
ContainerBuilder
完成所有您可以完成的操作。在我的示例中,我听了
激活
事件,然后使用
ReplaceInstance
替换实例,但您可以完成所有您想要的操作。谢谢。但是您不能为类服务(一个由自己注册的服务,而不是通过接口注册的服务)创建动态代理。因为类代理使用继承(Castle创建了一个新的类Castle.DynamicProxy.YourClassProxy,它派生自YourClass),并且在不提供ctor参数的情况下无法代理目标对象(除非它具有默认构造函数)。
builder.RegisterModule(new InterceptorModule()); 
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>();