2017-08-15 71 views
1

我有一個遺留應用程序,我想修改它以使用Ninject來減少耦合。使用Ninject綁定傳統類型

我有許多在數據層共享一個基本類型的類:

public abstract class BaseData { } 

public class Child1Data : BaseData { } 

public class Child2Data : BaseData { } 

我也有一個數的使用/類別管理這些:

public abstract class BaseManager { } 
public class Child1Manager : BaseManager { } 
public class Child2Manager : BaseManager { } 

我不得不創建一個映射到另一個的功能:

BaseManager GetManager(BaseData dataObject) 
{ 
    //Want to use Ninject to do this 
    if (dataObject is Child1Data) 
     return new Child1Manager(dataObject); 
    //...etc 
} 

我使用以下綁定創建了NinjectModule:

Bind<BaseManager>().To<Child1Manager>.Named(typeof(Child1Data).FullName); 
在我GetManager()函數

然後我可以這樣做:

BaseManager GetManager(BaseData dataObject) 
{ 
    return ServiceLocator.Get<BaseManager>(dataObject.GetType().FullName); 
} 

有沒有綁定服務,以特定類型的更簡單,更正確的方法是什麼?

我可以修改BaseManager的子項,但不幸的是我必須保留BaseData和GetManager()函數的簽名。

非常感謝您的意見和建議。這是我第一次接觸Ninject和依賴注入。

回答

0

您可以用工廠實現這一點:

public interface IManagerFactory 
{ 
    BaseManager GetManager(BaseData dataObject); 
} 


public class UseFirstArgumentTypeAsNameInstanceProvider : StandardInstanceProvider 
{ 
    protected override string GetName(System.Reflection.MethodInfo methodInfo, object[] arguments) 
    { 
     return arguments[0].GetType().FullName; 
    } 
} 

Bind<IManagerFactory>().ToFactory(() => new UseFirstArgumentTypeAsNameInstanceProvider()); 
Bind<BaseManager>().To<Child1Manager>().Named(typeof(Child1Data).FullName); 
Bind<BaseManager>().To<Child2Manager>().Named(typeof(Child2Data).FullName); 

然後注入你IManagerFactory,你想要的。