gpt4 book ai didi

c# - 使用 Autofac 解析通用抽象类的所有派生类

转载 作者:太空宇宙 更新时间:2023-11-03 22:51:14 26 4
gpt4 key购买 nike

我正在构建一个程序来处理来自各种主题的消息。由于每个主题的数据不同,我需要专门的类来使用任何给定主题的数据。我想使用处理与消息系统通信的基类和实现消息处理的派生类来这样做:

public abstract class MessageConsumer<T>
{
public void Start(){/*omitted*/}
/* Other abstract properties and methods here to support template pattern*/
}

Start方法会告诉 MessageConsumer开始引入新消息。派生类的例子是:

public class CreatedMessageConsumer : MessageConsumer<CreatedMessage>
{
/*Implementation omitted*/
}
public class DeletedMessageConsumer : MessageConsumer<DeletedMessage>{}

在上面的代码片段中,我省略了必需的构造函数参数,但很容易想象 DiContainer 在这里的用处。我使用Autofac。 CreatedMessageConsumer的注册和 DeletedMessageConsumer使用 Autofac 效果很好。

我的问题是如何解析派生自 MessageConsumer<> 的所有类.这SO post讨论如何解析给定的派生类型,但我想解析派生自 MessageConsumer所有 类型.随后我想调用Start所有这些方法,例如像

foreach(var consumer in container.Resolve<IEnumerable<MessageConsumer<??>>())
{
consumer.Start();
}

但是,由于我无法提供通用参数,因此无法编译。知道怎么做吗?我正在使用 Autofac 4.2.1。

最佳答案

如果您不关心通用参数,(否则您会在上一个代码块中指定通用参数),那么:

  • 定义一个接口(interface)(使用 Start 方法)
  • 在你的类型上实现它
  • 将其添加到定义 Autofac 注册的 As 链中
  • 解决新接口(interface)

更新代码:

public interface IStartable {
void Start();
}

public abstract class MessageConsumer<T> : IStartable
{
public void Start(){/*omitted*/}
/* Other abstract properties and methods here to support template pattern*/
}

调用代码:

foreach(var consumer in container.Resolve<IEnumerable<IStartable>>())
{
consumer.Start();
}

关于c# - 使用 Autofac 解析通用抽象类的所有派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47226232/

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