我不确定如何解决这个问题,甚至不知道该搜索什么。这是我想要做的。
给定基类,即合约
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实现这种类型的绑定?
答案 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);
}
希望有所帮助!