自动注入Func <t>的步骤究竟是什么?</t>

时间:2013-12-02 10:24:45

标签: c# c#-4.0 .net-4.0 ninject ninject-extensions

我正在尝试设置一个服务类,我想在其构造函数中注入一个简单的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设置的类库中。所以关键是我必须在该项目中引用任何与绑定相关的扩展,我在其中定义绑定。无论如何,听起来合乎逻辑......

1 个答案:

答案 0 :(得分:0)

问题似乎是我必须在我的启动项目中引用Factory扩展,我在其中定义绑定,而不是在我有基本Ninject设置的类库中。所以关键是我必须在该项目中引用任何与绑定相关的扩展,我在其中定义绑定。无论如何,听起来合乎逻辑......