gpt4 book ai didi

c# - autofac 解析所有类型的开放泛型类型?

转载 作者:太空狗 更新时间:2023-10-29 17:49:12 25 4
gpt4 key购买 nike

我猜想没有办法用 Autofac 做类似下面的事情,以 ctor 注入(inject)开放泛型类型的可枚举集合?各种 Handle 类型具有依赖性,否则我会动态构建它们。

    class EventOne : IEvent {...}
class EventTwo : IEvent {...}
class EventThree : IEvent {...}
interface IHandleEvent<T> where T : IEvent {...}
class HandleEventOne : IHandleEvent<EventOne> {...}
class HandleEventTwo : IHandleEvent<EventTwo> {...}
class HandleEventThree : IHandleEvent<EventThree> {...}

builder.RegisterAssemblyTypes(myAssembies).AsClosedTypesOf(typeof(IHandleEvent<>));
builder.RegisterType<AService>().As<IAService>();


class AService : IAService
{
public AService(IEnumerable<IHandleEvent<IEvent>> handles)
{...}
}

最佳答案

正如评论中所解释的,你想要的东西在 C# 中是不可能实现的,而且有充分的理由。如果你能投出 IHandleEvent<EventOne>IHandleEvent<IEvent>它会允许 EventTwo也被传入,这将在运行时失败。

因此,您需要的是一个中介抽象,它允许获取所有兼容的事件处理程序并调用它们。这样的中介通常被称为IEventPublisher可能看起来像这样:

public interface IEventPublisher {
void Publish(IEvent e);
}

您现在可以创建特定于容器的实现。例如,对于 Autofac,这将如下所示:

public class AutofacEventPublisher : IEventPublisher {
private readonly IComponentContext container;

public AutofacBusinessRuleValidator(IComponentContext container) {
this.container = container;
}

public void Publish(IEvent e) {
foreach (dynamic handler in this.GetHandlers(e.GetType())) {
handler.Handle((dynamic)e);
}
}

private IEnumerable GetHandlers(Type eventType) =>
(IEnumerable)this.container.Resolve(
typeof(IEnumerable<>).MakeGenericType(
typeof(IHandleEvent<>).MakeGenericType(eventType)));
}

消费者现在可以依赖这个新的抽象:

class AService : IAService
{
public AService(IEventPublisher publisher) {...}
}

关于c# - autofac 解析所有类型的开放泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36435361/

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