아래 샘플 코드를 참조하십시오. 그 단순화 된 시나리오는 내가 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) };
}
}
}
Thanks Remo. 문제 도메인을 단순화하기 위해 내 부분에 어리석은 오류가 발생했습니다. – afif