C# 在构造函数中传递参数,而不是设置属性
我只在MVC中使用了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
构造函数
进行依赖项注入,并创建了我的所有应用程序或实体对象,没有使用下面这样的构造
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
中,将网格绑定到类属性列表)。