等同于NInject和x27的Autofac;具有开放泛型的s ToMethod()

等同于NInject和x27的Autofac;具有开放泛型的s ToMethod(),ninject,autofac,Ninject,Autofac,我正试图从NInject迁移到Autofac,我遇到了一个看似简单的问题。我要迁移此NInject绑定: Kernel.Bind(typeof(IOptions)).ToMethod(c=>CreateOptions(c.Request.Service)); 换句话说,当需要关闭的IOptions时,使用请求的类型调用CreateOptions(),让我创建实现 我在Autofac中想到的最好的方法是: 创建IOptions的虚拟实现,让Autofac使用RegisterGeneric()构造

我正试图从NInject迁移到Autofac,我遇到了一个看似简单的问题。我要迁移此NInject绑定:

Kernel.Bind(typeof(IOptions)).ToMethod(c=>CreateOptions(c.Request.Service));
换句话说,当需要关闭的
IOptions
时,使用请求的类型调用
CreateOptions()
,让我创建实现

我在Autofac中想到的最好的方法是:

  • 创建
    IOptions
    的虚拟实现,让Autofac使用
    RegisterGeneric()
    构造它,然后在激活事件中使用
    ReplaceInstance()
  • 创建一个
    IRegistrationSource
    ,它按类型过滤,然后调用my factory方法
  • 方法(1)看起来很愚蠢——我当然不必创建一个未使用的对象来获取它的类型

    方法(2)是可以的,但它是一堆代码(见下文),如果我想设置范围等,它会变得更大

    在这两种情况下,简单地委托给工厂方法的代码量似乎都很大。有更好的办法吗

    (为了完整起见,下面是我的
    IRegistrationSource
    。请注意,要获得NInject功能,必须重写这两个抽象成员。)

    公共抽象类DelegatingRegistrationSource:IRegistrationSource
    {
    受保护的抽象布尔烛光门(limitType型);
    受保护的抽象DelegateActivator CreateDelegate(类型limitType);
    公共IEnumerable注册(服务、,
    职能注册助理)
    {
    如果(!(服务是IServiceWithType swt)| |!CanDelegate(swt.ServiceType))
    返回可枚举的.Empty();
    var注册=新组件注册(
    Guid.NewGuid(),
    CreateDelegate(swt.ServiceType),
    新建CurrentScopeLifetime(),
    实例共享。无,
    InstanceOwnership.OwnedByLifetimeScope,
    新[]{service},
    新字典());
    返回新的IComponentRegistration[]{registration};
    }
    public bool适用于单个组件=>false;
    }
    
    你让我想到了这个

    除了你现在已经找到的机制,我想不出更好的方法来解决这个问题。您可以使用开放泛型装饰器来做一些事情,但仍然需要虚拟类型,它并不比OnActivating解决方案好多少

    这就是OnActivating事件的作用,它对激活实例进行高级替换

    如果您愿意在我们的repo()中提出一个问题作为一个功能请求,并提供所有详细信息,我愿意讨论如果我们将其添加到库中,“理想”行为会是什么样子,以及用例是否足够常见以添加到库中。

    我已经提交了一份报告。感谢您的时间和关注!