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

时间:2014-05-22 17:00:57

标签: c# .net ninject ioc-container

我认为这在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_binding的实现并不重要。

所以基本上我们的想法是设置绑定,使Ninject用作键,每次IInner需要注入一个新的_binding,它只会返回现有实例,如果它有一个绑定到该特定{{1}},并创建一个新实例,如果没有。是否有一些简单的内置方式来做到这一点?如果没有,我可以得到关于方法的一些指导(不一定是完整实施)吗?

1 个答案:

答案 0 :(得分:2)

查看自定义范围.InScope()。这正是你要找的。

您向范围func&lt;&gt;提供对象的实例(您的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>();

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

更多信息: Ninject下的http://www.ninject.org/wiki.html - &gt;使用Ninject - &gt;对象范围。看看底部附近。 以及关于范围的一篇小文章:http://bobcravens.com/2010/03/ninject-life-cycle-management-or-scoping/

//干杯