gpt4 book ai didi

c# - MEF - 具有通用接口(interface)和 Lazy 的 ImportMany

转载 作者:行者123 更新时间:2023-11-30 16:24:00 24 4
gpt4 key购买 nike

我正在开发一个使用 MEF 的应用程序(特别是 MEF 2 Preview 5 ),我在尝试基于通用接口(interface)导入时遇到了问题。

我有一个界面:

public interface IMessageHandler<in T>
{
void HandleMessage(T message);
}

其中 T 是要处理的消息类型。我正在使用 RegistrationBuilder 将这些东西导入到目录中:

RegistrationBuilder context = new RegistrationBuilder();

context.ForTypesDerivedFrom(typeof(IMessageHandler<>))
.Export(builder => builder.AsContractType(typeof(IMessageHandler<>)));

然后,在我使用的消费类中 [ImportMany]将这些列表导入 IEnumerable<Lazy>> :

[ImportMany(typeof(IMessageHandler<>))]
IEnumerable<Lazy<IMessageHandler<object>, HandledMessageTypeAttribute>> _messageHandlers;

现在,这里是第一个问题 - 此时您被迫将类型分配给通用接口(interface)。我正在使用 Lazy<T, TMetadata>作为 IMessageHandler<T>实现具有我想要使用的相关元数据 ( HandledMessageTypeAttribute )。

现在,当我想访问 IEnumerable<Lazy<>> 中的任何元素时集合我得到以下异常:

Cannot cast the underlying exported value of type 
'MessageHandlerImplementation (ContractName="IMessageHandler(System.Object)")'
to type 'IMessageHandler`1[System.Object]'.

我明白(大致)为什么我会遇到异常,问题是我不知道如何解决它。所以,基本上我想做的是:

  1. 有一堆实现 IMessageHandler<T> 的类界面。
  2. 使用 MEF 在运行时发现它们。
  3. 将它们导入一个集合,这样我就可以使用它们拥有的任何元数据。
  4. 能够实例化它们。

我知道我可以简单地制作 IMessageHandler非通用且有 IMessageHandler.HandleMessage()接受 object 类型的参数但我正在寻找一个稍微更优雅的解决方案

欢迎任何指点或指导。

最佳答案

我看不出有更好的方法可以在不使用非通用接口(interface)的情况下完成您想要实现的目标。问题的根源是接口(interface)的定义:

public interface IMessageHandler<in T>

这意味着如果我们有两个类,AB,其中 B 派生自 A,那么这是允许的

IMessageHandler<B> handler = new AHandler();

但这不是:

IMessageHandler<A> handler = new BHandler();

您实质上是在尝试执行后者,这是导致抛出异常的原因。我假设您想要做的是能够在给定类型的情况下获得处理程序。如果是这种情况,那么您可能应该使用非通用接口(interface),并在导出元数据中提供可用的消息类型。然后你会得到这样的东西:

public IMessageHandler GetHandler<T>()
{
Type handlerType = typeof(T);
return _messageHandlers.FirstOrDefault(x => x.Metadata.MessageType == handlerType);
}

您可能会发现 this question也相关。希望这会有所帮助。

关于c# - MEF - 具有通用接口(interface)和 Lazy<T, TMetadata> 的 ImportMany,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11106450/

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