在 Autofac 中注册事件
Registering Event In Autofac
我认为 IComponentRegistry
接口中只有 Registered
事件实现。我想知道的是:有什么方法可以在注册时间时拦截每个注册以向其添加其他功能。 例如 Registering
事件?
比如我有一个接口IApplicationService
。这是一个标记接口,以常规方式注册所有ApplicationServices
。该接口将允许我在使用 DDD 方法设计的层中注册所有 ApplicationServices。所以,我想将 UnitOfWork 作为默认值 应用于 Registration[ 上的所有 ApplicationServices =31=] 拦截它们并用 UnitOfWorkInterceptor 装饰它们。这种方法导致,我需要一个 Registering
事件来应用任何 As<>
或 InterceptedBy<>
方法来将组件注册为附录。
我想这意味着在注册时间更新组件。我如何用这种方法处理我的注册?
你可以实现一个 Autofac 模块,它有一个 AttachToComponentRegistration
方法,每次注册都会触发
public class XModule : Module
{
protected override void AttachToComponentRegistration(
IComponentRegistry componentRegistry, IComponentRegistration registration)
{
// do whatever you want with registration
}
}
每次注册都会触发 AttachToComponentRegistration
:过去和将来。
Autofac.Extras.DynamicProxy2
扩展适用于 RegistrationBuilder
,而 Module
适用于 Registration
。 AFAIK 没有办法拦截
IRegistrationBuilder
并自动调用它的方法,因此没有简单的方法可以在 Module
上使用 InterceptedBy
等方法。
顺便说一句,你可以使用经典的 Castle.Core 拦截而不依赖 Autofac.Extras.DynamicProxy2
,像这样:
public class XModule : Module
{
public XModule()
{
this._generator = new ProxyGenerator();
}
private readonly ProxyGenerator _generator;
protected override void AttachToComponentRegistration(
IComponentRegistry componentRegistry,
IComponentRegistration registration)
{
if (registration.Services
.OfType<IServiceWithType>()
.Any(s => s.ServiceType == typeof(IApplicationService)))
{
registration.Activating += Registration_Activating;
}
}
private void Registration_Activating(Object sender, ActivatingEventArgs<Object> e)
{
Object proxy = this._generator.CreateClassProxyWithTarget(
e.Instance.GetType(),
e.Instance,
e.Context.Resolve<IEnumerable<IInterceptor>>().ToArray());
e.ReplaceInstance(proxy);
}
}
您可以浏览 Autofac.Extras.DynamicProxy2
模块的 source code 以了解如何将 Castle.Core 与 Autofac 集成.
我认为 IComponentRegistry
接口中只有 Registered
事件实现。我想知道的是:有什么方法可以在注册时间时拦截每个注册以向其添加其他功能。 例如 Registering
事件?
比如我有一个接口IApplicationService
。这是一个标记接口,以常规方式注册所有ApplicationServices
。该接口将允许我在使用 DDD 方法设计的层中注册所有 ApplicationServices。所以,我想将 UnitOfWork 作为默认值 应用于 Registration[ 上的所有 ApplicationServices =31=] 拦截它们并用 UnitOfWorkInterceptor 装饰它们。这种方法导致,我需要一个 Registering
事件来应用任何 As<>
或 InterceptedBy<>
方法来将组件注册为附录。
我想这意味着在注册时间更新组件。我如何用这种方法处理我的注册?
你可以实现一个 Autofac 模块,它有一个 AttachToComponentRegistration
方法,每次注册都会触发
public class XModule : Module
{
protected override void AttachToComponentRegistration(
IComponentRegistry componentRegistry, IComponentRegistration registration)
{
// do whatever you want with registration
}
}
每次注册都会触发 AttachToComponentRegistration
:过去和将来。
Autofac.Extras.DynamicProxy2
扩展适用于 RegistrationBuilder
,而 Module
适用于 Registration
。 AFAIK 没有办法拦截
IRegistrationBuilder
并自动调用它的方法,因此没有简单的方法可以在 Module
上使用 InterceptedBy
等方法。
顺便说一句,你可以使用经典的 Castle.Core 拦截而不依赖 Autofac.Extras.DynamicProxy2
,像这样:
public class XModule : Module
{
public XModule()
{
this._generator = new ProxyGenerator();
}
private readonly ProxyGenerator _generator;
protected override void AttachToComponentRegistration(
IComponentRegistry componentRegistry,
IComponentRegistration registration)
{
if (registration.Services
.OfType<IServiceWithType>()
.Any(s => s.ServiceType == typeof(IApplicationService)))
{
registration.Activating += Registration_Activating;
}
}
private void Registration_Activating(Object sender, ActivatingEventArgs<Object> e)
{
Object proxy = this._generator.CreateClassProxyWithTarget(
e.Instance.GetType(),
e.Instance,
e.Context.Resolve<IEnumerable<IInterceptor>>().ToArray());
e.ReplaceInstance(proxy);
}
}
您可以浏览 Autofac.Extras.DynamicProxy2
模块的 source code 以了解如何将 Castle.Core 与 Autofac 集成.