等同于NInject和x27的Autofac;具有开放泛型的s ToMethod()
我正试图从NInject迁移到Autofac,我遇到了一个看似简单的问题。我要迁移此NInject绑定:等同于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()构造
Kernel.Bind(typeof(IOptions)).ToMethod(c=>CreateOptions(c.Request.Service));
换句话说,当需要关闭的IOptions
时,使用请求的类型调用CreateOptions()
,让我创建实现
我在Autofac中想到的最好的方法是:
IOptions
的虚拟实现,让Autofac使用RegisterGeneric()
构造它,然后在激活事件中使用ReplaceInstance()
IRegistrationSource
,它按类型过滤,然后调用my factory方法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()中提出一个问题作为一个功能请求,并提供所有详细信息,我愿意讨论如果我们将其添加到库中,“理想”行为会是什么样子,以及用例是否足够常见以添加到库中。我已经提交了一份报告。感谢您的时间和关注!