我正在尝试使用C#开始一些简单的依赖注入,并且我遇到了一个我似乎无法得到答案的问题。
我有一个由另一个部门编写的课程,我的项目中没有该部门。我想通过使用接口的构造函数注入这种类型的对象,但当然,我无法更改注入的对象实现来实现接口,以在将对象转换为接口类型时实现多态性。
我见过的这种技术的每个学术例子都有类使用在项目中声明的类。如果项目中没有源代码,我将如何注入我的依赖项?
我希望这是有道理的,谢谢。
答案 0 :(得分:6)
您可以围绕目标类型创建一个包装器,例如,您可以使用它们提供的类:
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容器。
答案 1 :(得分:1)
问题是,为什么要将其作为接口注入?是因为类实现了一些你想抽象出来的属性/方法,所以它可以被替换,或者你只是试图“强制”一个标记接口,因为“我们总是依赖于接口,而不是具体的类” ?如果它是后者那么你就走错了路,因为你可能只是立即把它投到混凝土上。
假设前两者我可以看到两个选项:
对于选项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();
}
}
答案 2 :(得分:0)
如果您不需要更改课程中的任何内容,则几乎不需要代码。让我们假设您在DLL中有一个类X,您希望将其注入到您正在编写的另一个类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.