【发布时间】:2013-12-02 10:24:45
【问题描述】:
我正在尝试设置一个服务类,我想在其构造函数中注入一个简单的Func<OtherService> 工厂方法。 OtherService 类型是一个类,它应该是自绑定的(当我在没有工厂的情况下注入它时确实如此)。
我已经安装了最新的 Ninject 核心和 Ninject.Extensions.Factory NuGet 包。当我尝试从 Ninject 检索实例时,我收到一个关于无法激活 IntPtr 的激活异常。
我做错了什么?如果我正确理解工厂扩展的文档,这种类型的 Func 绑定应该是自动的,无需任何配置。我需要在任何地方注册工厂扩展,还是为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() 绑定。
这些定制中的任何一个都可能对工厂的正常工作产生影响?
编辑2:
我想我明白了。问题似乎是我必须在我定义绑定的启动项目中引用工厂扩展,而不是在我有基本 Ninject 设置的类库中。所以关键是我必须在我定义绑定的那个项目中引用任何与绑定相关的扩展。无论如何,听起来合乎逻辑......
【问题讨论】:
-
能否请您使用堆栈跟踪发布完整的错误消息?您还可以创建并发布一个重现测试用例吗?因为我无法重现这个问题;取决于
Func<OtherService>应该可以工作... -
我准备了一个干净的小项目,激活在那里工作正常。我的真实项目相当大,我在 Ninject 上使用了一些自定义项。我将编辑我的问题以提供详细信息。
标签: c# c#-4.0 .net-4.0 ninject ninject-extensions