2014-01-22 107 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