【问题标题】:Use Ninject to bind legacy types使用 Ninject 绑定遗留类型
【发布时间】:2018-01-23 18:31:11
【问题描述】:

我有一个遗留应用程序,我想修改它以使用 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 和依赖注入。

【问题讨论】:

    标签: c# ninject


    【解决方案1】:

    您可以通过工厂实现此目的:

    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 注入您想要的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多