2017-08-15 81 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,你想要的。