C# 是否有一种简单的方法将所有可用类型绑定到一个具体实例
我有以下接口和具体实现:C# 是否有一种简单的方法将所有可用类型绑定到一个具体实例,c#,ninject,C#,Ninject,我有以下接口和具体实现: interface IFoo { string Name { get ;} } class Foo :IFoo{ public string Name { get; set; } } interface IBar { string Name { get; } } class Bar : IBar { public string Name { get;set;} public Bar(Foo foo) {
interface IFoo {
string Name { get ;}
}
class Foo :IFoo{
public string Name { get; set; }
}
interface IBar {
string Name { get; }
}
class Bar : IBar {
public string Name { get;set;}
public Bar(Foo foo) {
}
}
您可以看到,在类构造函数中,Bar依赖于Foo
以下是我的绑定:
kernel.Bind<IFoo>().ToConstant(new Foo() { Name="Foo"; });
kernel.Bind<IBar>().To<Bar>();
是否有一种方便的方法将Foo的特定实例绑定到所有可用的接口和具体类型
例如:
class ConcreteFoo : AbstractFoo, IFoo {
...
}
var foo = new Foo();
kernel.Bind<IFoo>().ToConstant(foo);
kernel.Bind<AbstractFoo>().ToConstant(foo);
kernel.Bind<ConcreteFoo>().ToConstant(foo);
Bind<IFoo,Foo>().To<Foo>().InSingletonScope();
class-ConcreteFoo:AbstractFoo,IFoo{
...
}
var foo=new foo();
kernel.Bind().ToConstant(foo);
kernel.Bind().ToConstant(foo);
kernel.Bind().ToConstant(foo);
我有一个通用框架。框架之外是客户机定义的Foo和Bar。我希望客户端能够灵活地在Bar构造函数中指定IFoo或Foo。如果构造函数被定义为Bar(IFoo),客户端可能会将其强制转换为Foo。ninject没有提供此类功能。ninject提供的是绑定到多个类型,例如:
class ConcreteFoo : AbstractFoo, IFoo {
...
}
var foo = new Foo();
kernel.Bind<IFoo>().ToConstant(foo);
kernel.Bind<AbstractFoo>().ToConstant(foo);
kernel.Bind<ConcreteFoo>().ToConstant(foo);
Bind<IFoo,Foo>().To<Foo>().InSingletonScope();
根据您的示例,以下测试通过:
[Fact]
public void FactMethodName()
{
var kernel = new StandardKernel();
var foo = new Foo();
RegisterConstantAsAllTypes(kernel, foo);
kernel.Get<IFoo>().Should().Be(foo);
kernel.Get<Foo>().Should().Be(foo);
kernel.Get<AbstractFoo>().Should().Be(foo);
}
[事实]
public void FactMethodName()
{
var kernel=新的标准内核();
var foo=new foo();
RegisterConstantAsAllTypes(内核,foo);
kernel.Get().Should().Be(foo);
kernel.Get().Should().Be(foo);
kernel.Get().Should().Be(foo);
}
这对我来说似乎有点奇怪,因为真实的用例是什么。在我看来,Bar
应该要求一个IFoo
。依赖项反转的全部要点。在我看来,命名依赖项更符合您的需要。我会让客户机强制转换Foo
,因为这遵循了反转原则。命名依赖项是否允许我方便地拥有一个绑定,并且它将适用于所有派生类型和接口。你能给我举个简单的例子吗?不,他们不会。您需要绑定每个类型。这里有一些语法上的糖分,因此您可以进行多类型绑定,比如Bind().ToConstant(newfoo())
。这会将实例同时绑定到IFoo
和Foo
。您能解释一下谁在进行绑定以及框架的任务是什么吗?如何确保没有多次实现IFoo
?AbstractFoo
的多个子项?你怎么知道要实例化哪个?