Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Ninject绑定遗留类型_C#_Ninject - Fatal编程技术网

C# 使用Ninject绑定遗留类型

C# 使用Ninject绑定遗留类型,c#,ninject,C#,Ninject,我有一个遗留应用程序,我想修改它以使用Ninject来减少耦合 我在数据层中有许多类共享一个基本类型: public abstract class BaseData { } public class Child1Data : BaseData { } public class Child2Data : BaseData { } 我还有许多类使用/管理这些: public abstract class BaseManager { } public class Child1Manager :

我有一个遗留应用程序,我想修改它以使用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);
Bind().To.Named(typeof(Child1Data).FullName);
然后在我的GetManager()函数中,我可以执行以下操作:

BaseManager GetManager(BaseData dataObject)
{
    return ServiceLocator.Get<BaseManager>(dataObject.GetType().FullName);
}
BaseManager GetManager(BaseData数据对象)
{
返回ServiceLocator.Get(dataObject.GetType().FullName);
}
是否有一种更简单、更合适的方法将服务绑定到特定类型

我可以修改BaseManager的子级,但不幸的是,我必须保留BaseData和GetManager()函数的签名


提前感谢您的想法和建议。这是我第一次接触Ninject和依赖项注入。

您可以通过工厂实现这一点:

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
{
BaseManager GetManager(BaseData数据对象);
}
公共类UseFirstArgumentTypeAsNameInstanceProvider:StandardInstanceProvider
{
受保护的重写字符串GetName(System.Reflection.MethodInfo MethodInfo,对象[]参数)
{
返回参数[0]。GetType().FullName;
}
}
Bind().ToFactory(()=>新UseFirstArgumentTypeAsNameInstanceProvider());
Bind().To().Named(typeof(Child1Data.FullName);
Bind().To().Named(typeof(Child2Data.FullName);

然后将您的
IManagerFactory
注入您想要的位置。

您可以通过工厂实现这一点:

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
{
BaseManager GetManager(BaseData数据对象);
}
公共类UseFirstArgumentTypeAsNameInstanceProvider:StandardInstanceProvider
{
受保护的重写字符串GetName(System.Reflection.MethodInfo MethodInfo,对象[]参数)
{
返回参数[0]。GetType().FullName;
}
}
Bind().ToFactory(()=>新UseFirstArgumentTypeAsNameInstanceProvider());
Bind().To().Named(typeof(Child1Data.FullName);
Bind().To().Named(typeof(Child2Data.FullName);
然后将您的
IManagerFactory
注入您想要的位置