0

아래 샘플 코드를 참조하십시오. 그 단순화 된 시나리오는 내가 WhenInjectedInto 메서드를 사용하여 바인딩 할 때 발생하는 문제를 보여줍니다. 이것은 항상 이전 버전의 ninject와 함께 작동합니다. 그러나이 3.0으로의 업그레이드로 어디에서 문제가 발생 하는지를 알 수 없습니다. WhenInjectedInto 메소드가 제대로 적용되면 순환 종료가 발생하지 않아야 할 때 순환 종속성 예외가 발생합니다 (예 : 데코레이터 자체에 주입 됨).Ninject 3.0 일반 바인딩을 사용하여 장식 할 때의 순환 종속성 오류

이것은 너무 단순한 시나리오이므로 클래스와 인터페이스는 규칙을 따르므로이 코드 샘플의 경우 ioc 코드가 적고 실제 코드를 사용하여 기본 규칙을 사용하여 솔루션을 얻을 수 있습니다. 시나리오 나는 유창하게 컨벤션을 따르는 클래스와 인터페이스를 갖지 않을 것이다.

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) }; 
    } 
} 
} 

답변

0

Where 조건이 잘못되었습니다. PersonIPerson을 할당 할 수 없습니다. 인수를 전환하십시오.

+0

Thanks Remo. 문제 도메인을 단순화하기 위해 내 부분에 어리석은 오류가 발생했습니다. – afif