我有一种模式在我工作的时候一直出现。我几乎完全是一名网络开发人员,而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扩展程序,但我从未能够使用它。
这个的正确绑定语法是什么?
答案 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}}