c# – 依赖注入/ SOLID忧虑
作者:互联网
我有一个用C#编写的Web API应用程序.我正在努力确保设计符合SOLID原则.因此我使用Unity将依赖项注入我的控制器.但是我希望将控制器执行的操作从控制器本身中取出,因此它们实际上只是在其他(通常是静态的)对象上调用方法.例如:
public class MyController : ApiController
{
private readonly ISomeCrossCuttingInterface _instance;
private readonly ILog _log;
public MyController(ISomeCrossCuttingInterface someInterface, ILog log)
{
_instance = someInterface;
_log = log;
}
[HttpPost]
[ActionName("MyAction")]
public RequestResponse MyAction(MyActionData actionData)
{
try
{
return MyActionUser(actionData);
}
catch (Exception ex)
{
_log.Error("MyAction error", ex);
}
return ...;
}
private RequestResponse MyActionUser(MyActionData actionData)
{
var responseObj = StaticClass.SomeMethod(_instance, actionData);
var responseObj2 = StaticClass2.SomeMethod(_instance, responseObj2);
return CreateMyActionResponse(responseObj2);
}
private RequestResponse CreateMyActionResponse(...)
{
...
}
}
我遇到的一些焦虑是用于执行工作的对象(例如上面的StaticClass和StaticClass2)是否应该实际注入.目前他们不是.已注入的对象是与交叉切割问题相关的对象,例如日志记录或数据访问,或由多个控制器使用的对象.那么为什么我不注入执行工作的对象呢?我认为这些“内部”对象仅用于执行与一个控制器相关的特定工作.也就是说,控制器功能基本上被分解为具有单一责任的对象,每个控制器都拥有自己独特的对象集,无论控制器需要做什么.不过这是一个糟糕的设计吗?是否应该注射所有物体?任何输入真的很感激.
解决方法:
使用SOLID原则被广泛接受,它将使您的代码更易于维护,可测试和灵活.如果您使用其中一些原则,那么最好不要使用任何原则.
试着想想如果你想以某种方式改变静态类会发生什么.您是否可以确信此更改不会破坏您的某个控制器?您可以为静态类进行单元测试,也可以为控制器进行单元测试,但是您需要进行集成测试以检查它们是否一起工作.如果您注入静态类,那么您可以轻松地进行单元测试以检查方法是否被调用,返回正确的结果等.
此外,你真的不希望你的控制器做这个逻辑,它应该是好的和精益的,所以把所有内容放入服务,让服务处理逻辑,调用存储库等.然后将服务注入控制器.
标签:c,dependency-injection,asp-net-web-api,solid-principles 来源: https://codeday.me/bug/20190717/1490828.html