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

时间:2010-06-17 07:06:23

标签: c# dependency-injection

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

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

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

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

3 个答案:

答案 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)

问题是,为什么要将其作为接口注入?是因为类实现了一些你想抽象出来的属性/方法,所以它可以被替换,或者你只是试图“强制”一个标记接口,因为“我们总是依赖于接口,而不是具体的类” ?如果它是后者那么你就走错了路,因为你可能只是立即把它投到混凝土上。

假设前两者我可以看到两个选项:

  1. 请改用继承。根据已创建的类,这可能会也可能不会成为可能,但您可以继承它并将旧类替换为旧类。
  2. 使用您需要的方法/属性自己创建接口,并将外部具体类包装在实现接口的类中。
  3. 对于选项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.