以下のサンプルコードをご覧ください。WhenInjectedInto
メソッドを使用してバインドするときに発生している問題を示すための単純化されたシナリオです。これは以前のバージョンの ninject で常に機能していました。しかし、この 3.0 へのアップグレードでは、どこに問題があるのかわかりません。WhenInjectedInto
メソッドが適切に適用された場合、循環依存例外が発生するはずがありません (つまり、デコレータがそれ自体に注入されています) 。
また、これは非常に単純化されたシナリオであるため、クラスとインターフェイスは規則に従っていることに注意してください。したがって、このコード サンプルでは、デフォルトの規則を使用して 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) };
}
}
}