如何正确使用Ninject的NamedScope扩展?

时间:2014-08-20 22:30:15

标签: c# .net ninject ninject-extensions

我有一种模式在我工作的时候一直出现。我几乎完全是一名网络开发人员,而Ninject的InRequestScope可以满足我99%的需求。

以下是模式:

// abstractions

interface IFoo {
    void FooMe();
    int GetSomeValue();
}

interface IBar {
    void BarMe();
}

interface IFooBar {
    void FooAndBar();
}

// concrete classes

class Foo : IFoo {
    public void FooMe() { Console.WriteLine("I have fooed"); }
    public void GetSomeValue() { return 123; }
}

class Bar : IBar {
    private readonly IFoo _Foo;

    public Bar(IFoo foo) { _Foo = foo; }

    public void BarMe() { Console.WriteLine("Bar: {0}", _Foo.GetSomeValue()); }
}

class FooBar : IFooBar {
    private readonly IFoo _Foo;
    private readonly IBar _Bar;

    public Bar(IFoo foo, IBar bar) { _Foo = foo; _Bar = bar; }
    public void FooAndBar() {
        _Foo.FooMe();
        _Bar.BarMe();
    }
}

// bindings
kernel.Bind<IFoo>().To<Foo>();
kernel.Bind<IBar>().To<Bar>();
kernel.Bind<IFooBar>().To<FooBar>();

我想要做的是设置它,以便每次kernel.Get<IFooBar>它创建正好一个 Foo并将其注入Bar和FooBar的构造函数中。

我已尝试使用Named Scope扩展程序,但我从未能够使用它。

这个的正确绑定语法是什么?

1 个答案:

答案 0 :(得分:2)

所以你要做的就是定义一些名字:

const string FooBarScopeName = "FooBarScope";

然后定义范围:

kernel.Bind<IFooBar>().To<FooBar>()
      .DefinesNamedScope(FooBarScopeName);

并绑定指定范围内的Foo(名称必须匹配!):

kernel.Bind<IFoo>().To<Foo>();
      .InNamedScope(FooBarScope);

替代:

还有InCallScope(),如果每次创建kernel.Get()时只有一个IFooBar,则可以使用kernel.Bind<IFoo>().To<Foo>().InCallScope(); 。在这种情况下,只需:

{{1}}