我认为这是 Ninject 中一个相对简单的场景,但我一直很难找到正确的术语来搜索它。我想做类似的事情:public interface IClass{ IInner Inner { get; }}public class ConcreteClass : IClass{ public ConcreteClass(IInner inner) { Inner = inner; } public IInner Inner {get; private set;}}public class Test{ private BindingObject _binding {get; set;} private override BindingTest() { //These two lines need some extra configuration Kernel.Bind<IClass>().To<ConcreteClass>(); Kernel.Bind<IInner>().To<ConcreteInner>(); _binding = new BindingObject(1); IClass class1 = Kernel.Get<IClass>(); _binding = new BindingObject(2); IClass class2 = Kernel.Get<IClass>(); _binding = new BindingObject(1); IClass class3 = Kernel.Get<IClass>(); //The bindings should be set up such that these asserts both pass Assert.AreSame(class1.Inner, class3.Inner); Assert.AreNotSame(class1.Inner, class2.Inner); }}BindingObject 的实现并不重要,因为这只是一个玩具示例,想法只是当且仅当传递给它们的构造函数的 BindingObjects 相同时,两个 int 才会比较相等。同样,IInner 和 ConcreteInner 的实现也无关紧要。所以本质上的想法是设置绑定(bind),以便 _binding 用作键,并且每次 Ninject 需要注入(inject)新的 IInner 时,如果它绑定(bind)到该特定 _binding ,它将只返回现有实例,并创建一个如果不是新的。有没有一些直接的内置方法来做到这一点?如果没有,我能否获得一些有关方法的指导(不一定是完整的实现)? 最佳答案 查看自定义范围 .InScope() 。这正是您要寻找的。您向作用域 func 提供了一个对象实例(您的 BindingObject )。在内核中创建/检索实例时,此对象用作引用。内核将检查 IInner 的实例是否存在并引用该对象;如果是,则返回实例,否则创建新实例。例子:Kernel.Bind<IClass>().To<ConcreteClass>();Kernel.Bind<IInner>().To<ConcreteInner>().InScope(o => { return _binding ; });var reference1 = new object();var reference2 = new object();_binding = reference1;var class1 = kernel.Get<IClass>();_binding = reference2;var class2 = kernel.Get<IClass>();_binding = reference1;var class3 = kernel.Get<IClass>();这里 class1 和 class3 将具有与 IInner 相同的引用,而 class2 将具有另一个引用。更多信息请访问: Ninject 下的 http://www.ninject.org/wiki.html -> Using Ninject -> Object Scopes。看看底部附近。以及一篇关于范围的小文章:http://bobcravens.com/2010/03/ninject-life-cycle-management-or-scoping///干杯关于c# - 在 Ninject 绑定(bind)中将实例映射到对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23813038/
10-09 03:35