dependency-injection - 具有开放泛型和运行时指定类型的 Autofac

标签 dependency-injection ioc-container autofac

文档指出 Autofac 支持开放泛型,我能够在基本情况下进行注册和解析,如下所示:

登记:

builder.RegisterGeneric(typeof(PassThroughFlattener<>))
       .As(typeof(IFlattener<>))
       .ContainerScoped();

解决:
var flattener = _container.Resolve<IFlattener<Address>>();

上面的代码工作得很好。但是,假设直到运行时我才知道提供给 IFlattener 的类型,我想做这样的事情:
object input = new Address();
var flattener = (IFlattener)_container.Resolve(typeof(IFlattener<>), new TypedParameter(typeof(IFlattener<>), input.GetType()));

这可以用 AutoFac 实现吗?我从以下使用 StructureMap 得到了这个想法:

http://structuremap.sourceforge.net/Generics.htm

我正在努力实现本文中概述的相同目标。

最佳答案

Autofac当然可以做到这一点。在“注册时间”,这就是您的基本操作:

  • 注册开放泛型类型 (PassThroughFlattener<>)
  • 注册任何特定类型 (AddressFlattener)
  • 注册一个可用于根据输入对象解析 IFlattener 的方法

  • 在“解决时间”,您将执行以下操作:
  • 解决方法
  • 调用带有输入参数的方法来解析 IFlattener 实现

  • 这是一个(希望如此)工作示例:
    var openType = typeof(IFlattener<>);
    
    var builder = new ContainerBuilder();
    builder.RegisterGeneric(typeof(PassThroughFlattener<>)).As(openType);
    builder.Register<AddressFlattener>().As<IFlattener<Address>>();
    builder.Register<Func<object, IFlattener>>(context => theObject => 
        {
            var closedType =
                openType.MakeGenericType(theObject.GetType());
                return (IFlattener) context.Resolve(closedType,
                    new PositionalParameter(0, theObject));
        });
    var c = builder.Build();
    
    var factory = c.Resolve<Func<object, IFlattener>>();
    
    var address = new Address();
    var addressService = factory(address);
    
    Assert.That(addressService, Is.InstanceOfType(typeof(AddressFlattener)));
    
    var anything = "any other data";
    var anyService = factory(anything);
    
    Assert.That(anyService, Is.InstanceOfType(typeof(PassThroughFlattener<string>)));
    

    关于dependency-injection - 具有开放泛型和运行时指定类型的 Autofac,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1523336/

    相关文章:

    c# - WCF 为 IIS 注册依赖项

    c# - 通过 JSON 文件配置 ServiceCollection

    c# - 如何重置 IOC 容器中的所有实例

    java - Spring NON MVC 项目配置 - 最佳实践

    c# - 没有通用接口(interface)和扫描组件的注册适配器

    c# - 使用 Ninject 的 Autofac InstancePerHttpRequest

    dependency-injection - 依赖注入(inject)成瘾?

    java - 为什么 Spring 不将我的 @Autowired 成员连接到依赖的 jar 中?

    c# - 创建 Controller 失败,表明 Controller 需要无参数公共(public)构造函数

    c# - StructureMap 通过注入(inject)而不是服务定位来解决依赖