我正在尝试设置一个服务类,我想在其构造函数中注入一个简单的Func<OtherService>
工厂方法。类型OtherService
是一个类,它应该是自我约束的(确实是在我没有工厂时注入它)。
我已经安装了最新的Ninject核心和Ninject.Extensions.Factory NuGet包。当我尝试从Ninject检索实例时,我得到一个关于无法激活IntPtr的激活异常。
我做错了什么?如果我正确理解了Factory扩展的文档,那么这种类型的Func绑定应该是自动的,无需任何配置。我是否需要在任何地方注册Factory扩展,或者为OtherService
创建显式绑定?任何提示将不胜感激。
编辑:
我将Ninject和Ninject.Extensions.Factory安装在一个小的独立项目中,我在Ninject上做了一些自定义。这些如下:
Kernel.Components.Add<IInjectionHeuristic, CustomInjectionHeuristic>();
Kernel.Components.Add<IActivationStrategy, TransientDisposableActivationStrategy>();
这两个自定义处理程序用于让我使用我的自定义[Service]属性来指示属性注入,以及处理使用我自己的IDisposableEx接口(带有Disposed通知)进行Ninject缓存微调的组件。
public class CustomInjectionHeuristic : NinjectComponent, IInjectionHeuristic, INinjectComponent, IDisposable
{
public bool ShouldInject(MemberInfo member)
{
return member.IsDefined(typeof(ServiceAttribute), true);
}
}
public class TransientDisposableActivationStrategy : ActivationStrategy
{
public override void Activate(IContext context, InstanceReference reference)
{
var scope = context.GetScope();
// care about only transient scoped objects
if (scope != null) return;
if (reference.Instance is Component)
reference.Instance.As<Component>().Disposed +=
(sender, args) => context.Kernel.Components.Get<ICache>().Clear(sender);
if (reference.Instance is IDisposableEx)
reference.Instance.As<IDisposableEx>().Disposed +=
(sender, args) => context.Kernel.Components.Get<ICache>().Clear(sender);
}
}
我还使用Ninject.Extensions.NamedScope扩展来进行InCallScope()绑定。
任何这些自定义都可能对工厂的正常工作产生影响吗?
EDIT2:
我想我明白了。问题似乎是我必须在我的启动项目中引用Factory扩展,我在那里定义绑定,而不是在我有基本Ninject设置的类库中。所以关键是我必须在该项目中引用任何与绑定相关的扩展,我在其中定义绑定。无论如何,听起来合乎逻辑......
答案 0 :(得分:0)
问题似乎是我必须在我的启动项目中引用Factory扩展,我在其中定义绑定,而不是在我有基本Ninject设置的类库中。所以关键是我必须在该项目中引用任何与绑定相关的扩展,我在其中定义绑定。无论如何,听起来合乎逻辑......