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/单元测试狂热者。这是如何编译的?