使用Ninject绑定旧版类型

时间:2017-08-15 18:52:30

标签: c# 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和依赖注入。

1 个答案:

答案 0 :(得分: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注入您想要的位置。