Ninject绑定基于合同的类型

时间:2014-01-22 04:38:24

标签: ninject

我不确定如何解决这个问题,甚至不知道该搜索什么。这是我想要做的。

给定基类,即合约

public class BaseContract
{ }

其中有两个sublcasses

public class Contract1 : BaseContract
{
    public string Name { get; set; }
    public string Surname { get; set; }

}

public class Contract2 : BaseContract
{
    public int Id { get; set; }
    public string Stuff { get; set; }
}

我想将接口IMyClass绑定到MyClass1或MyClass2,具体取决于我收到的合同。所以调用方法就像是。

public void Test(BaseContract contract)
{
   var classToGet = kernel.Get<IMyClass>(typeof(contract));
}

我尝试将其绑定如下

        Bind<IMyClass>()
            .To<MyClasses2>()
            .WithMetadata("ContractType", typeof(Contract2));

但这似乎没有帮助。

如何使用Ninject实现这种类型的绑定?

1 个答案:

答案 0 :(得分:1)

您可以使用Ninject Named Bindings实现此目的,如下所示:

Bind<IMyClass>().To<MyClasses1>().Named(typeof(Contract1).Name);
Bind<IMyClass>().To<MyClasses2>().Named(typeof(Contract2).Name);

然后,您可以使用常见的注入模式之一(构造函数,属性,方法等)执行注入:

public class ClassWithDependency
{
    // To achieve property injection
    [Inject, Named("Contract2")]
    public IMyClass Contract2Instance {get; set;}


    // Constructor injection
    public ClassWithDependency([Named("Contract2") contract2Instance)
    {
         //Save reference to your dependency here
    }
}

或者您甚至可以使用服务定位器(如您的示例,但不推荐)来实现您的目标:

public void Test(BaseContract contract)
{
   var classToGet = kernel.Get<IMyClass>(typeof(contract).Name);
}

希望有所帮助!