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
的多个子项?你怎么知道要实例化哪个?