c# - 运行时的 Autofac 通用服务解析

标签 c# autofac

最近,CaSTLe 通过内核提供的实现添加了对接口(interface)工厂的支持。我想知道在 autofac 中是否也有办法做到这一点。我读过有关委托(delegate)工厂的信息,但我想我可能遗漏了一些东西,并且无法让它工作。这是我的想法:

class Message { }

interface IHandle<T> {
    void Handle(T message);
}

class Handle<Message> : IHandle<Message> {
    ...
}

class Bus {
    .ctor (? lookup) {
        _lookup = lookup;
    }

    void Send<T>(T message) {
        _lookup.GetHandler<T>().Handle(message);
    }
}

var builder = new ContainerBuilder();
builder.RegisterType<Handle<Message>>().As<IHandle<Message>>();
builder.RegisterType<Bus>();

var container = builder.Build();
container.Resolve<Bus>().Send<Message>(new Message());

我想做的是让容器远离总线(因为我同意服务定位器是一种反模式)或任何其他实现。如果我只是将容器提供给总线,或者创建一些包装容器的类工厂,这个问题就很容易了。只是想确保目前还没有办法做到这一点。

顺便说一句,城堡方式 iirc 允许我注册这样的东西:

interface IHandlerFactory {
    IHandle<T> GetHandler<T>();
}

container.Register<IHandlerFactory>().AsFactory();

谢谢, 尼克

最佳答案

您可以通过创建一个具体的 IHandlerFactory 来隔离该耦合,说 AutofacHandlerFactory , 它将收到 ILifetimeScope .这种耦合似乎是不可避免的,因为容器是唯一可以解析正确的 IHandler<T> 的容器。 .

耦合ILifetimeScope可能是个坏主意,但是,联轴器在混凝土内部隔离 IHandlerFactory , 和 Bus只是通过一个界面使用它。假设您更改容器并开始使用 Ninject,您可以只实现一个 NinjectHandlerFactory完成这项工作。

关于c# - 运行时的 Autofac 通用服务解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8579128/

相关文章:

c# - 如何为类(class)中的所有测试设置测试类别

c# - 如何使用发布日期作为 .net 项目的程序集版本?

c# - 如何在autofac中的解析时间上传递参数

c# - "UpdateSourceTrigger=PropertyChanged"相当于 Windows Phone 7 文本框

C# HttpListener : IE11 does not apply CSS

autofac - 使用 Autofac 配置 StackExchange.Redis 的最佳实践是什么?

windows-services - 如何使用 Autofac 容器解析类型的实例?

c# - 使用 Autofac,如何在调用 RegisterControllers 后在单个 mvc Controller 上启用属性注入(inject)?

c# - 每个匹配生命周期范围的实例,默认?

c# - 通过编程 Linq/Lambda 创建订单