C#依赖注入 - 如何在没有源的情况下注入依赖项?

Phi*_*ris 5 c# dependency-injection

我正在尝试使用C#开始一些简单的依赖注入,并且我遇到了一个我似乎无法想出答案的问题.

我有一个由另一个部门编写的课程,我的项目中没有该部门.我想通过使用接口的构造函数注入这种类型的对象,但当然,我无法更改注入的对象实现来实现接口,以在将对象转换为接口类型时实现多态.

我见过的这种技术的每个学术例子都有类使用在项目中声明的类.如果项目中没有源代码,我将如何注入我的依赖项?

我希望这是有道理的,谢谢.  

Mat*_*ott 6

您可以围绕目标类型创建一个包装器,例如,您可以拥有它们提供的类:

public class TheirClass
{
  public void DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

您可以使用它来定义接口:

public interface ITheirClass
{
  void DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

并在包装类上实现该接口:

public class TheirClassWrapper : TheirClass, ITheirClass
{

}
Run Code Online (Sandbox Code Playgroud)

或者,如果他们提供的课程是密封的,您需要略有不同:

public class TheirClassWrapper : ITheirClass
{
  private TheirClass instance = new TheirClass();

  public void DoSomething()
  {
    instance.DoSomething();
  }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以注入该接口.

我知道在MEF中我们可以导出具体类型并正确注入,但我不确定其他IoC容器.


Kan*_*kan 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
    }
}
Run Code Online (Sandbox Code Playgroud)

在你的主代码中:

//Create instance of X
X instanceOfX = new X();
//Inject it into Y
Y instanceOfY = new Y(instanceOfX);
//Use Y now.
Run Code Online (Sandbox Code Playgroud)