我正在尝试使用C#进行简单的依赖注入,并遇到了一个问题,我似乎找不到答案。
我有一个类,是由另一个部门编写的,但我在我的项目中没有源代码。我想通过构造函数使用接口注入这种类型的对象,但是当将对象转换为接口类型时,我无法更改注入对象的实现以实现多态。
我曾见过的每个学术示例都使用在项目本身中声明的类。如果没有可用于项目的源代码,我该如何注入依赖项?
希望这样说有意义,谢谢。
我正在尝试使用C#进行简单的依赖注入,并遇到了一个问题,我似乎找不到答案。
我有一个类,是由另一个部门编写的,但我在我的项目中没有源代码。我想通过构造函数使用接口注入这种类型的对象,但是当将对象转换为接口类型时,我无法更改注入对象的实现以实现多态。
我曾见过的每个学术示例都使用在项目本身中声明的类。如果没有可用于项目的源代码,我该如何注入依赖项?
希望这样说有意义,谢谢。
public class TheirClass
{
public void DoSomething();
}
使用此功能可以定义一个接口:
public interface ITheirClass
{
void DoSomething();
}
在一个包装类上实现该接口:
public class TheirClassWrapper : TheirClass, ITheirClass
{
}
或者,如果他们提供的类是密封的,则需要稍微不同的方法:
public class TheirClassWrapper : ITheirClass
{
private TheirClass instance = new TheirClass();
public void DoSomething()
{
instance.DoSomething();
}
}
那么您可以注入该接口。
我知道在MEF中,我们可以导出具体类型并正确地注入它们,但我不确定其他IoC容器是否也能做到。
假设以上两种情况中的前者,我可以看到两个选项:
对于选项2,如果您无法继承,例如,假设您只关心类中的一个方法(我们称之为Method1()),则可以为其创建匹配的接口:
public interface IMyNewInterface
{
void Method1();
}
然后创建一个实现它的类,将具体的类作为依赖项(像正常情况下由容器注入)并调用具体的类:
public class MyNewClass : IMyNewInterface
{
private MyConcreteClass _MyConcreteClass;
public void MyNewClass(MyConcreteClass concreteClass)
{
_MyConcreteClass = concreteClass;
}
public void Method1()
{
_MyConcreteClass.Method1();
}
}
如果您不需要更改类中的任何内容,那么您几乎不需要代码。假设您有一个名为X的类位于DLL中,您希望将其注入到另一个您正在编写的Y类中。在这种情况下,您可以创建X的实例,并将其作为构造函数中Y的参数。示例如下:
将包含类X的DLL添加到您的项目中的引用中。
Use NameSpaceOfX;
Class Y
{
Public Y() //Default constructor
{
}
Public Y(X instanceOfX)
{
//Use instanceOfX here as required
}
}
//Create instance of X
X instanceOfX = new X();
//Inject it into Y
Y instanceOfY = new Y(instanceOfX);
//Use Y now.