编程语言
首页 > 编程语言> > c# – 依赖注入/ SOLID忧虑

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