【问题标题】:Dependency Injection in a class library类库中的依赖注入
【发布时间】:2021-09-11 14:15:09
【问题描述】:

我喜欢依赖注入 (DI) 的想法,但是当我尝试在现实世界的示例中使用 DI 时,我总是碰壁。 在类的实例(MyParentClass)中处理时,我经常想将任何“特殊”处理传递给类的实例(MyChildClass)。通常我想在该子类中使用 DI 实例(MyStringManipulator)。 我发现实现这一点的唯一工作方法是将该 DI 实例(MyStringManipulator)传递给我的类库中的整个父->子实例链。 似乎应该有一个更简单/更好的方法。 谢谢你的帮助。

public class MyParentClass
{
   public string ManipulateString( string s)
   {
      MyChildClass my = new MyChildClass();
      return my.Process(s);
   }
}

public class MyChildClass
{
   MyStringManipulator _manipulator = null;
   public MyChildClass (MyStringManipulator manipulator )
   {
      _manipulator = manipulator;
   }
   public string Process( string s)
   {
      return _manipulator.Manipulate(s);
   }
}

【问题讨论】:

  • 您是否考虑过将MyChildClass 也注入MyParentClass
  • 如果您想知道如何设置 DI,您可以向您的库添加一个扩展方法,为库内的依赖项设置 DI。在消费应用程序中,您然后执行services.AddMySuperDuperLibrary(); 之类的操作,仅此而已。 (我假设您使用的是 MS Dependency Injection,但也可以使其与 Ninject 或 AutoFac 等其他容器框架一起使用)
  • @KellyHarris 根据提供的答案,您的问题似乎有些混乱。所以我建议你编辑问题以澄清事情
  • 只需将其作为构造函数参数即可。每件事都应该在组合根中进行配置和传递。我认为您关注的是错误的事情,或者对如何应用 DI 感到困惑。

标签: winforms asp.net-core dependency-injection


【解决方案1】:

您应该在父类中注入您的子类,以便您可以应用正常的 DI 架构。但请注意,如果您将多次注入堆叠到一个类中,您的类可能会做很多事情。

public class MyParentClass
{
   private readonly MyChildClass _my;
   
   public MyParentClass(MyChildClass my)
   {
      _my = my;
   }
   
   public string ManipulateString(string s)
   {
      return _my.Process(s);
   }
}

public class MyChildClass
{
   MyStringManipulator _manipulator = null;

   public MyChildClass (MyStringManipulator manipulator)
   {
      _manipulator = manipulator;
   }

   public string Process(string s)
   {
      return _manipulator.Manipulate(s);
   }
}

【讨论】:

  • 谢谢@Rene,但这并不能回答问题。
  • @KellyHarris 是否所有子对象都需要所有这些依赖项?你能解耦它们吗?
  • @KellyHarris 我强烈建议您重新考虑该设计。 Logging should not be a dependency.
  • @KellyHarris 当您进行超过 5 次注射时,您可能遇到了软件设计问题。您应该考虑将您的课程拆分为更小一次。如果问题只是您的日志记录实例,我认为 MarkSeemann 提供了一个很好的链接。
  • @KellyHarris 我已经向您指出了可以回答这些问题的资源。我无法为 OP 代码提供更好的设计,因为不清楚该代码是否会产生任何错误,也没有其他日志记录需求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
  • 2023-02-24
  • 2010-09-21
  • 2017-10-13
相关资源
最近更新 更多