gpt4 book ai didi

.net - 装饰器不适用于 RegisterAll 中指定的实现类型

转载 作者:行者123 更新时间:2023-12-02 21:45:16 27 4
gpt4 key购买 nike

在此代码中:

container.Register<IDataHoldingSession<DbContext>, EntityFrameworkSession>();
container.RegisterAll<ISession>(typeof(IDataHoldingSession<DbContext>));
container.RegisterDecorator(typeof(IDataHoldingSession<>), typeof(ValidatingSession<>));

当容器被要求IEnumerable<ISession>时,给出一个包含 EntityFrameworkSession 的集合,但未应用装饰器。我怎样才能让它应用上面代码中的装饰器?

我相信发生这种情况是因为容器没有被要求 IEnumerable<IDataHoldingSession<T>> 。我将 XML 文档解释为 RegisterAll暗示容器将被要求提供 IDataHoldingSession<DbContext> 的实例在这种情况下,我认为这应该导致应用装饰器。但是,在这种情况下装饰器似乎被绕过,因为 RegisterAllISession 调用服务类型。

最佳答案

我可以通过向 RegisterAll 提供 Registration 来解决此问题。我将每个注册的服务类型设置为其特定的服务类型,而不是 ISession

这是一个演示这一点的扩展方法:

/// <summary>
/// Same as <see cref="Container.RegisterAll"/>, except each implementation service
/// is individually resolved from the container for compatibility with decorators.
/// </summary>
public static void RegisterAllBugFixed<TService>(this Container container,
params Type[] serviceTypes)
{
var registrations =
from serviceType in serviceTypes
select Lifestyle.Transient.CreateRegistration(
serviceType,
() => container.GetInstance(serviceType),
container);

container.RegisterAll(typeof(TService), registrations);
}

关于.net - 装饰器不适用于 RegisterAll 中指定的实现类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19646905/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com