2014-01-22 51 views
0

我不太清楚如何解决这个问题,甚至是真正要搜索的内容。这是我想要做的。基于合同类型的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

你可以做到这一点使用Ninject命名绑定,如下所示:

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); 
} 

希望有所帮助!

+0

非常好,非常感谢你,这正是我所期待的。 – Dirk