Ninject 2.0:没有属性的属性注入

t3m*_*jin 9 dependency-injection ninject ioc-container ninject-2

有没有办法在不使用[Inject]属性的情况下在Ninject 2中使用Property Injection ?这会在类中使用Ninject创建一个依赖项,我宁愿避免对IoC容器有不必要的依赖,这就是我最常使用Constructor Injection的原因.

我想这同样适用于方法注入

t3m*_*jin 8

我按照鲁本的提示发布了一篇关于如何实现这一目标的小博文,但这里的答案很简单:

创建自定义属性:

public class InjectHereAttribute : Attribute
{
}
Run Code Online (Sandbox Code Playgroud)

目标类现在看起来像这样:

public class Samurai
{
    [InjectHere]        
    public IWeapon Context { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在必须将Ninject配置为使用自定义属性,这可以通过创建识别自定义属性的IInjectionHeuristic实现来完成:

public class CustomInjectionHeuristic : NinjectComponent, IInjectionHeuristic, INinjectComponent, IDisposable
{
    public new bool ShouldInject(MemberInfo member)
    {
        return member.IsDefined(
          typeof(InjectHereAttribute),
          true);
    }
}
Run Code Online (Sandbox Code Playgroud)

最后使用Components集合将此行为添加到Ninject内核,它将沿现有组件运行,即IInjectionHeuristic的默认实现,这意味着可以使用默认属性或自定义属性.

// Add custom inject heuristic
kernel.Components.Add<IInjectionHeuristic, CustomInjectionHeuristic>();
Run Code Online (Sandbox Code Playgroud)