事件总线代理 - 如何在 OnActivating 事件期间解析 IEnumerable<T>
Proxy for event bus - how to resolve IEnumerable<T> during OnActivating event
考虑到我有一些接口,例如:IFirstEvent
等。现在,我可以有多个 IFirstEvent
接口的实现。我想在 ContainerBuilder
中注册所有实现,以便在实现(和其他 Autofac 功能)中使用依赖注入。接下来,我想将 IFirstEvent
替换为将调用其他实现的代理 class (在解析时)(我想注入单个 IFirstEvent
而不是 IEnumerable<IFirstEvent>
以便用它)。
我写了以下片段:
var localEventType = typeof(IFirstEvent);
builder.RegisterAssemblyTypes(this.assemblies)
.AssignableTo(localEventType)
.As(localEventType)
.InstancePerRequest()
.OnActivating(ctx =>
{
var allImplementations =
(IEnumerable)
ctx.Context
.Resolve(typeof(IEnumerable<>)
.MakeGenericType(localEventType));
var proxy = MultiInterfaceProxy.For(
localEventType,
allImplementations);
ctx.ReplaceInstance(proxy);
});
不幸的是,注册会抛出有关循环依赖的错误(很明显 - 在解析 IFirstEvent
的集合时,每个项目都会被代理 class 替换)。
那么,如何用代理替换实例并能够找到并解析接口的所有具体实现?
我不想手动搜索具体实现的程序集,因为我需要手动创建实例(我想避免它以便让 autofac 管理生命周期)。也许没有别的办法?
避免循环依赖的一种可能方法是使用键控服务注册您的实现,然后将委托注册为您的服务:
var localEventType = typeof(IFirstEvent);
builder.RegisterAssemblyTypes(this.assemblies)
.AssignableTo(localEventType)
.Keyed(ProxyBuilder.ProxyKey, localEventType)
.InstancePerRequest();
builder.Register(c =>
{
Type enumerableEventType = typeof(IEnumerable<>).MakeGenericType(localEventType);
IEnumerable implementations = (IEnumerable)c.ResolveKeyed(ProxyBuilder.ProxyKey,
enumerableEventType);
var proxy = MultiInterfaceProxy.For(localEventType,
implementations);
});
ProxyBuilder.ProxyKey
是常数。即:
public static class ProxyBuilder
{
public static readonly Object ProxyKey = new Object();
}
考虑到我有一些接口,例如:IFirstEvent
等。现在,我可以有多个 IFirstEvent
接口的实现。我想在 ContainerBuilder
中注册所有实现,以便在实现(和其他 Autofac 功能)中使用依赖注入。接下来,我想将 IFirstEvent
替换为将调用其他实现的代理 class (在解析时)(我想注入单个 IFirstEvent
而不是 IEnumerable<IFirstEvent>
以便用它)。
我写了以下片段:
var localEventType = typeof(IFirstEvent);
builder.RegisterAssemblyTypes(this.assemblies)
.AssignableTo(localEventType)
.As(localEventType)
.InstancePerRequest()
.OnActivating(ctx =>
{
var allImplementations =
(IEnumerable)
ctx.Context
.Resolve(typeof(IEnumerable<>)
.MakeGenericType(localEventType));
var proxy = MultiInterfaceProxy.For(
localEventType,
allImplementations);
ctx.ReplaceInstance(proxy);
});
不幸的是,注册会抛出有关循环依赖的错误(很明显 - 在解析 IFirstEvent
的集合时,每个项目都会被代理 class 替换)。
那么,如何用代理替换实例并能够找到并解析接口的所有具体实现? 我不想手动搜索具体实现的程序集,因为我需要手动创建实例(我想避免它以便让 autofac 管理生命周期)。也许没有别的办法?
避免循环依赖的一种可能方法是使用键控服务注册您的实现,然后将委托注册为您的服务:
var localEventType = typeof(IFirstEvent);
builder.RegisterAssemblyTypes(this.assemblies)
.AssignableTo(localEventType)
.Keyed(ProxyBuilder.ProxyKey, localEventType)
.InstancePerRequest();
builder.Register(c =>
{
Type enumerableEventType = typeof(IEnumerable<>).MakeGenericType(localEventType);
IEnumerable implementations = (IEnumerable)c.ResolveKeyed(ProxyBuilder.ProxyKey,
enumerableEventType);
var proxy = MultiInterfaceProxy.For(localEventType,
implementations);
});
ProxyBuilder.ProxyKey
是常数。即:
public static class ProxyBuilder
{
public static readonly Object ProxyKey = new Object();
}