在Ninject绑定中将实例映射到对象

本文关键字:映射 对象 实例 Ninject 绑定 | 更新日期: 2023-09-27 18:04:44

我认为这在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的实现并不重要,因为这只是一个玩具示例,其想法只是当且仅当传递给其构造函数的int相同时,两个BindingObjects将比较相等。同样,IInnerConcreteInner的实现也不重要。

因此,本质上的想法是设置绑定,使_binding被用作密钥,每次Ninject需要注入新的IInner时,如果它与特定的_binding绑定,它将返回现有的实例,如果没有,则创建一个新实例。是否有一些直接的内置方法来做到这一点?如果没有,我可以得到一些关于方法的指导(不一定是完整的实现)吗?

在Ninject绑定中将实例映射到对象

看一下自定义作用域.InScope()。这正是你要找的。

向作用域func_& lt;>提供对象(BindingObject)的实例。该对象在内核中创建/检索实例时用作引用。

内核将检查是否存在IInner的实例并引用该对象;如果是,返回instance,否则创建new。

的例子:

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

这里class1class3将具有IInner的相同引用,而class2将具有另一个引用。

更多信息请访问:http://www.ninject.org/wiki.html在Ninject -> Using Ninject -> Object scope下。看底部附近。还有一篇关于作用域的小文章:http://bobcravens.com/2010/03/ninject-life-cycle-management-or-scoping/

//欢呼