C# 在构造函数中传递参数,而不是设置属性

C# 在构造函数中传递参数,而不是设置属性,c#,asp.net-mvc,oop,constructor,C#,Asp.net Mvc,Oop,Constructor,我只在MVC中使用了构造函数进行依赖项注入,并创建了我的所有应用程序或实体对象,没有使用下面这样的构造 public class MyEntity { public string FirstName{get;set;} public Type PropName{get;set;} } 然而,我看到许多人出于某种目的使用构造函数。我知道我们可以用构造函数初始化一些东西。但是我应该考虑创建什么样的构造函数,比如下面的?< /代码>使用只读字段并设置它们 public class L

我只在MVC中使用了
构造函数
进行依赖项注入,并创建了我的所有应用程序或实体对象,没有使用下面这样的构造

public class MyEntity
{
    public string FirstName{get;set;}
    public Type PropName{get;set;}
}
然而,我看到许多人出于某种目的使用构造函数。我知道我们可以用构造函数初始化一些东西。但是<代码>我应该考虑创建什么样的构造函数,比如下面的?< /代码>使用只读字段并设置它们

public class Licence
{
    private readonly Instant expiry;
    private readonly IClock clock;

    public Licence(Instant expiry, IClock clock)
    {
        this.expiry=expiry;
        this.clock=clock;
    }

    //some methods & prop goes here
}

我在MVC和一些由架构师设计的高级应用程序框架中看到过这种代码。

通常,当不希望在对象实例化后更改这些值时,您会在构造函数中传入参数;这可以应用于各种情况,包括依赖项注入。常见的情况是自定义
异常
类,您希望传递无法修改的附加信息:

public class MyException : Exception
{
    public string MyField { get; private set; }

    public MyException(string myField)
    {
        this.MyField = myField;
    }
}

依赖注入,考虑向类提供日志提供程序实现:

public class MyClass
{
    public ILogger Logger { get; private set; }

    public MyClass(ILogger logger)
    {
        this.Logger = logger;
    }
}

在这两种情况下,您不希望属性在创建后发生更改,因为它们会更改实例的基本含义或行为

通常,当不希望在对象实例化后更改这些值时,您会在构造函数中传入参数;这可以应用于各种情况,包括依赖项注入。常见的情况是自定义
异常
类,您希望传递无法修改的附加信息:

public class MyException : Exception
{
    public string MyField { get; private set; }

    public MyException(string myField)
    {
        this.MyField = myField;
    }
}

依赖注入,考虑向类提供日志提供程序实现:

public class MyClass
{
    public ILogger Logger { get; private set; }

    public MyClass(ILogger logger)
    {
        this.Logger = logger;
    }
}

在这两种情况下,您不希望属性在创建后发生更改,因为它们会更改实例的基本含义或行为

我只在使用依赖项注入的类中使用构造函数,或者当我想设置我不想再更改的数据时使用构造函数。例如,MVC控制器:

private readonly IProductService _productService;
private readonly IShoppingCartService _shoppingCartService;

public ProductController(IProductService productService,
                         IShoppingCartService shoppingCartService)
{
    _productService = productService;
    _shoppingCartService = shoppingCartService;
}
对于我的域模型,我不会创建构造函数来填充我的公共属性。这将产生如下构造函数:

public Order(string orderReference,
             string userEmail,
             string paymentIssuer,
             bool? isProcessed,
             ICollection<OrderDetail> orderDetails)
{
    OrderReference = orderReference;
    UserEmail = userEmail;
    PaymentIssuer = paymentIssuer;
    IsProcessed = isProcessed;
    OrderDetails = orderDetails;
}
new Order
    {
        OrderReference = "test",
        UserEmail = "john@doe.com",
        PaymentIssuer = "test",
        IsProcessed = true
    };
这使得争论的意思完全不清楚,我更喜欢。看起来是这样的:

public Order(string orderReference,
             string userEmail,
             string paymentIssuer,
             bool? isProcessed,
             ICollection<OrderDetail> orderDetails)
{
    OrderReference = orderReference;
    UserEmail = userEmail;
    PaymentIssuer = paymentIssuer;
    IsProcessed = isProcessed;
    OrderDetails = orderDetails;
}
new Order
    {
        OrderReference = "test",
        UserEmail = "john@doe.com",
        PaymentIssuer = "test",
        IsProcessed = true
    };
但是,我有时会为我的域模型创建一个无参数构造函数,其中我设置了一些默认数据:

public Order()
{
    UserId = Guid.NewGuid();
    OrderDetails = new List<OrderDetail>();
}
公共秩序()
{
UserId=Guid.NewGuid();
OrderDetails=新列表();
}

我只在使用依赖项注入的类中使用构造函数,或者当我想设置我不想再更改的数据时使用构造函数。例如,MVC控制器:

private readonly IProductService _productService;
private readonly IShoppingCartService _shoppingCartService;

public ProductController(IProductService productService,
                         IShoppingCartService shoppingCartService)
{
    _productService = productService;
    _shoppingCartService = shoppingCartService;
}
对于我的域模型,我不会创建构造函数来填充我的公共属性。这将产生如下构造函数:

public Order(string orderReference,
             string userEmail,
             string paymentIssuer,
             bool? isProcessed,
             ICollection<OrderDetail> orderDetails)
{
    OrderReference = orderReference;
    UserEmail = userEmail;
    PaymentIssuer = paymentIssuer;
    IsProcessed = isProcessed;
    OrderDetails = orderDetails;
}
new Order
    {
        OrderReference = "test",
        UserEmail = "john@doe.com",
        PaymentIssuer = "test",
        IsProcessed = true
    };
这使得争论的意思完全不清楚,我更喜欢。看起来是这样的:

public Order(string orderReference,
             string userEmail,
             string paymentIssuer,
             bool? isProcessed,
             ICollection<OrderDetail> orderDetails)
{
    OrderReference = orderReference;
    UserEmail = userEmail;
    PaymentIssuer = paymentIssuer;
    IsProcessed = isProcessed;
    OrderDetails = orderDetails;
}
new Order
    {
        OrderReference = "test",
        UserEmail = "john@doe.com",
        PaymentIssuer = "test",
        IsProcessed = true
    };
但是,我有时会为我的域模型创建一个无参数构造函数,其中我设置了一些默认数据:

public Order()
{
    UserId = Guid.NewGuid();
    OrderDetails = new List<OrderDetail>();
}
公共秩序()
{
UserId=Guid.NewGuid();
OrderDetails=新列表();
}

如何将它们定义为
只读
并在构造函数中进行设置?如果您可以通过类直接公开成员,那么这很好,但并非在所有情况下都有效。例如,在某些情况下,如果要绑定到该值,则必须将其作为属性而不是成员进行绑定(即在
WPF
中,将网格绑定到类属性列表中)。将其定义为
readonly
并在构造函数中设置如何?如果可以通过类直接公开成员,则可以这样做,但它并不适用于所有情况。例如,在某些情况下,如果要绑定到该值,则必须将其作为属性而不是成员进行绑定(即在
WPF
中,将网格绑定到类属性列表)。