C# 为什么要将连接字符串放在构造函数中,而不是将其忽略?

C# 为什么要将连接字符串放在构造函数中,而不是将其忽略?,c#,asp.net-mvc-5,C#,Asp.net Mvc 5,我在控制器中看到了连接字符串的不同实现 其中一些非常简单: public class tableNameController : Controller { private ConnectionStringName db = new ConnectionStringName(); ... 其他包括: public class tableNameController : Controller { private ConnectionStringName db; p

我在控制器中看到了连接字符串的不同实现

其中一些非常简单:

public class tableNameController : Controller
{
    private ConnectionStringName db = new ConnectionStringName();
    ...
其他包括:

public class tableNameController : Controller
{
    private ConnectionStringName db;

    public tableNameController()
    {
        db = new ConnectionStringName();
    }

将连接字符串放在构造函数中或将其作为私有变量保留有什么好处?

实际上,.NET运行时处理这些情况的方式完全相同。它生成相同的IL,所以它是任何在语法上看起来更好的东西


现在,还有很多其他的考虑因素使这个测试变得可测试和干净。我会做一些关于依赖注入和单元测试的研究。

NET运行时实际上处理这些情况完全相同。它生成相同的IL,所以它是任何在语法上看起来更好的东西


现在,还有很多其他的考虑因素使这个测试变得可测试和干净。我会做一些关于依赖注入和单元测试的研究。

没有区别,但是如果你看看这个答案:

kokos有很好的规则来决定是否应该在构造函数中使用Initialization:

  • 不要在声明中使用默认值初始化(null、false、0、0.0…)
  • 如果没有更改字段值的构造函数参数,则更喜欢在声明中初始化
  • 如果字段的值由于构造函数参数而更改,则将初始化放在构造函数中
  • 在实践中保持一致(最重要的规则)

  • 没有区别,但如果你看看这个答案:

    kokos有很好的规则来决定是否应该在构造函数中使用Initialization:

  • 不要在声明中使用默认值初始化(null、false、0、0.0…)
  • 如果没有更改字段值的构造函数参数,则更喜欢在声明中初始化
  • 如果字段的值由于构造函数参数而更改,则将初始化放在构造函数中
  • 在实践中保持一致(最重要的规则)

  • 从最佳实践的角度来看,这两种方法的设计都很差。在这两种情况下,测试都很难覆盖此代码。考虑下一个方法:

    public class TableNameController : Controller
    {
        private readonly ConnectionStringName _db;
    
        public TableNameController(ConnectionStringName db)
        {
            _db = db;
        }
    }
    
    请记住,我还添加了
    readonly
    construction,它将帮助您确保除了
    constructor
    之外,没有人可以将值设置为字段。同样,在这种方法中——在单元测试中,将模拟的ConnectionStringName实例传递到构造函数中是很容易的

    如果你想了解更多关于最佳实践的信息,只需在谷歌上搜索
    SOLID
    DRY
    KISS
    IoC
    。这是帮助您编写易于阅读、结构良好且可维护的代码所需的方法/实践列表


    顺便说一句,不要害怕开始调查,开发人员有时喜欢用非常复杂的方式谈论简单的事情

    从最佳实践的角度来看,这两种方法的设计都很差。在这两种情况下,测试都很难覆盖此代码。考虑下一个方法:

    public class TableNameController : Controller
    {
        private readonly ConnectionStringName _db;
    
        public TableNameController(ConnectionStringName db)
        {
            _db = db;
        }
    }
    
    请记住,我还添加了
    readonly
    construction,它将帮助您确保除了
    constructor
    之外,没有人可以将值设置为字段。同样,在这种方法中——在单元测试中,将模拟的ConnectionStringName实例传递到构造函数中是很容易的

    如果你想了解更多关于最佳实践的信息,只需在谷歌上搜索
    SOLID
    DRY
    KISS
    IoC
    。这是帮助您编写易于阅读、结构良好且可维护的代码所需的方法/实践列表


    顺便说一句,不要害怕开始调查,开发人员有时喜欢用非常复杂的方式谈论简单的事情

    主要基于观点。糟糕的设计。保持控制器倾斜。注入服务将上下文保留在控制器之外。(免责声明:我没有否决投票)@Nkosi你知道有任何显示依赖注入的好教程吗?你使用的是哪个版本的mvc?5.*还是核心?在微软官方网站上有很多关于DI@BviLLe_Kid这门课程帮助我理解了依赖注入和其他类似的东西是如何工作的:主要是基于观点的。糟糕的设计。保持控制器倾斜。注入服务将上下文保留在控制器之外。(免责声明:我没有否决投票)@Nkosi你知道有任何显示依赖注入的好教程吗?你使用的是哪个版本的mvc?5.*还是核心?在微软官方网站上有很多关于DI@BviLLe_Kid这门课程帮助我理解了依赖注入和其他类似的东西是如何工作的: