【问题标题】:Cyclic dependency error when decorating using Ninject 3.0 conventional bindings使用 Ninject 3.0 常规绑定进行装饰时出现循环依赖错误
【发布时间】:2012-05-19 15:18:15
【问题描述】:

请参阅下面的示例代码。它是一个过于简化的场景,用于演示我在使用 WhenInjectedInto 方法绑定时遇到的问题。这一直适用于早期版本的 ninject。但是有些如何升级到 3.0 我看不出问题出在哪里。如果WhenInjectedInto 方法得到正确应用,我不应该得到一个循环依赖异常(即装饰器被注入自身)。

using System;
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework;
using Ninject.Extensions.Conventions;
using Ninject.Extensions.Conventions.BindingGenerators;
using Ninject.Syntax;

namespace Ninject.Usage.Spike
{
public class ElderlyPerson : IPerson
{
    private readonly IPerson _actual;

    public ElderlyPerson(IPerson actual)
    {
        _actual = actual;
    }

    public string Name { get { return string.Format("Sir {0}", _actual.Name); } }
}

public class Person : IPerson
{
    public string Name { get; protected set; }
}

public interface IPerson { string Name { get; } }

[TestFixture]
public class Class1
{
    [Test]
    public void Test()
    {
        using(var k = new StandardKernel())
        {
            k.Bind<IPerson>().To<ElderlyPerson>().InSingletonScope();
            k.Bind(x => x.FromThisAssembly()
                            .SelectAllClasses()
                            .Where(t => t.IsAssignableFrom(typeof (IPerson)))
                            .BindWith<MyGenerator>()
                            .Configure(c => c.WhenInjectedInto<ElderlyPerson>().InSingletonScope()));

            var person = k.Get<IPerson>();
            Assert.That(person.Name, Is.StringContaining("Sir"));
        }
    }
}

public class MyGenerator : IBindingGenerator
{
    public IEnumerable<IBindingWhenInNamedWithOrOnSyntax<object>> CreateBindings(Type type, IBindingRoot bindingRoot)
    {
        return type == typeof(ElderlyPerson) 
            ? Enumerable.Empty<IBindingWhenInNamedWithOrOnSyntax<object>>() 
            : new[] { bindingRoot.Bind(typeof(IPerson)).To(type) };
    }
}
}

【问题讨论】:

    标签: inversion-of-control ninject decorator cyclic-reference


    【解决方案1】:

    您的Where 条件错误!您不能将IPerson 分配给Person。切换参数。

    【讨论】:

    • 谢谢雷莫。我试图简化问题域的愚蠢错误。
    猜你喜欢
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 2021-01-05
    • 1970-01-01
    • 2014-10-07
    相关资源
    最近更新 更多