C# 实体和依赖注入

C# 实体和依赖注入,c#,dependency-injection,C#,Dependency Injection,我有一个这样的服务和一个响应实体: public class MyService : IMyService { private readonly IService1 _service1; private readonly IService2 _service2; public MyService(IService1 service1, IService2 service2) { _service1 = service1; _service2 =

我有一个这样的服务和一个响应实体:

public class MyService : IMyService
{
   private readonly IService1 _service1;
   private readonly IService2 _service2;

   public MyService(IService1 service1, IService2 service2)
   {
      _service1 = service1;
      _service2 = service2;
   }

   public Response method1()
   {
      //DO SOMETHING
      return new Response() { ... };
   }

   public Response method2()
   {
      //DO SOMETHING
      return new Response() { ... };
   }
}

//Entities folder
public class Response
{
   public bool Success { get; set; }
   public string ErrorMessage { get; set; }
}
有人试图说服我,响应实体应该这样注入:

public class MyService : IMyService
{
   private readonly IService1 _service1;
   private readonly IService2 _service2;
   private readonly IResponse _response;

   public MyService(IService1 service1, IService2 service2, IResponse response)
   {
      _service1 = service1;
      _service2 = service2;
      _response = response;
   }

   public Response method1()
   {
      //DO SOMETHING
      return _response() { ... };
   }

   public Response method2()
   {
      //DO SOMETHING
      return _response() { ... };
   }
}

public class Response : IResponse
{
   public bool Success { get; set; }
   public string ErrorMessage { get; set; }
}

我确信第一个解决方案是正确的,但我想确定一下。有人能给我一个意见和理由吗?谢谢

这取决于您是否需要对其进行单元测试。一般来说,如果你的目标是完全覆盖单元测试,那么在类中更新任何内容都可能被认为是不好的做法。在这种情况下,我将使用第二个示例,因为响应可以被模拟。这实际上取决于您需要做什么以及单元测试的目标是什么。我同意第二个,第一个对于响应对象来说根本不是DI。第二个允许您模拟或注入不同的功能。使用第一个的唯一原因是,如果你永远不会得到任何其他类型的响应,或者你不需要对该对象使用DI,我不明白你为什么要这样做。在这个级别上,您将进行单元测试,以确保您的代码基于注入的依赖项(即示例中的
IService1
IService2
)为您提供适当的
响应。如果您注入
i响应
对象,那么此时您并不是在真正测试代码,而是在测试您的模拟框架是否能够注入正确的对象。然而,让返回类型
IResponse
而不是
Response
是我会做的事情,特别是当您需要模拟它的一些行为进行测试时。实际上,如果在计算响应时使用
Response
的方法,我可以看到注入它。然而,如果它真的像您在示例中提供的那样,我个人认为这太过分了,我是一个DI/单元测试的狂热者。它是如何编译的?这取决于您是否需要对它进行单元测试。一般来说,如果你的目标是完全覆盖单元测试,那么在类中更新任何内容都可能被认为是不好的做法。在这种情况下,我将使用第二个示例,因为响应可以被模拟。这实际上取决于您需要做什么以及单元测试的目标是什么。我同意第二个,第一个对于响应对象来说根本不是DI。第二个允许您模拟或注入不同的功能。使用第一个的唯一原因是,如果你永远不会得到任何其他类型的响应,或者你不需要对该对象使用DI,我不明白你为什么要这样做。在这个级别上,您将进行单元测试,以确保您的代码基于注入的依赖项(即示例中的
IService1
IService2
)为您提供适当的
响应。如果您注入
i响应
对象,那么此时您并不是在真正测试代码,而是在测试您的模拟框架是否能够注入正确的对象。然而,让返回类型
IResponse
而不是
Response
是我会做的事情,特别是当您需要模拟它的一些行为进行测试时。实际上,如果在计算响应时使用
Response
的方法,我可以看到注入它。然而,如果它真的像您在示例中提供的那样,我个人认为这是过分的,我是一个DI/单元测试狂热者。这是如何编译的?